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.

Foi útil?

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"}]
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top