Criando um objeto JSON serializado duplo em REST SOE C#
-
21-12-2019 - |
Pergunta
Não tenho certeza se estou serializando duas vezes meu objeto JSON, mas a saída resulta em um formato indesejado.Estou expondo o endpoint REST por meio de uma extensão de objeto do ArcGIS Server (REST SOE).Também implementei recentemente o JSON.Net, o que essencialmente me permitiu remover várias linhas de código.
Então aqui está o manipulador, que é a peça principal que cria os dados para o serviço (para vocês que não são GIS).
private byte[] SearchOptionsResHandler(NameValueCollection boundVariables, string outputFormat, string requestProperties, out string responseProperties)
{
responseProperties = null;
JsonObject result = new JsonObject();
// Towns
DataTable dataTableTowns = GetDataTableTowns();
String jsonStringTowns = JsonConvert.SerializeObject(dataTableTowns);
result.AddString("Towns", jsonStringTowns);
// GL_Description
DataTable dataTableGLDesc = GetDataTableGLDesc();
String jsonStringGLDesc = JsonConvert.SerializeObject(dataTableGLDesc);
result.AddString("GLDesc", jsonStringGLDesc);
return Encoding.UTF8.GetBytes(result.ToJson());
}
O resultado é um JSON com escape feio:
{
"Towns": "[{\"Column1\":\"ANSONIA\"},{\"Column1\":\"BETHANY\"},{\"Column1\":\"BLOOMFIELD\"}]",
"GLDesc": "[{\"Column1\":\"Commercial\"},{\"Column1\":\"Industrial\"},{\"Column1\":\"Public\"}]"
}
É porque estou serializando duas vezes de alguma forma?Obrigado por examinar isso.
Solução
Sim, você está serializando-o duas vezes.Está bem ali no seu código.
Para cada uma de suas tabelas de dados, dataTableTowns
e dataTableGLDesc
, você está ligando JsonConvert.SerializeObject()
para convertê-los em strings JSON, que você adiciona a um resultado JsonObject
.Você então liga ToJson()
no resultado, que provavelmente serializa tudo para JSON novamente.
JsonObject
não faz parte do Json.Net, enquanto JsonConvert
é, então eu recomendaria usar um ou outro.Geralmente, você deseja apenas acumular tudo em um único objeto de resultado e serializar tudo uma vez no final.Aqui está como eu faria isso com Json.Net usando um objeto anônimo para armazenar o resultado:
var result = new
{
Towns = GetDataTableTowns(),
GLDesc = GetDataTableGLDesc()
};
string json = JsonConvert.SerializeObject(result);
return Encoding.UTF8.GetBytes(json);
Aqui está a saída:
{
"Towns":[{"Column1":"ANSONIA"},{"Column1":"BETHANY"},{"Column1":"BLOOMFIELD"}],
"GLDesc":[{"Column1":"Commercial"},{"Column1":"Industrial"},{"Column1":"Public"}]
}