Domanda

Non sono sicuro di serializzare due volte il mio oggetto JSON, ma l'output risulta in un formato indesiderato.Sto esponendo l'endpoint REST tramite ArcGIS Server Object Extension (REST SOE).Recentemente ho anche implementato JSON.Net che essenzialmente mi ha permesso di rimuovere diverse righe di codice.

Quindi ecco il gestore, che è l'elemento fondamentale che crea i dati per il servizio (per voi non 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());
    }

Il risultato è un JSON con scaping brutto:

{
    "Towns": "[{\"Column1\":\"ANSONIA\"},{\"Column1\":\"BETHANY\"},{\"Column1\":\"BLOOMFIELD\"}]",
    "GLDesc": "[{\"Column1\":\"Commercial\"},{\"Column1\":\"Industrial\"},{\"Column1\":\"Public\"}]"
}

È perché lo sto serializzando due volte in qualche modo?Grazie per averlo esaminato.

È stato utile?

Soluzione

Sì, lo stai serializzando due volte.È proprio lì nel tuo codice.

Per ciascuna delle tue tabelle di dati, dataTableTowns E dataTableGLDesc, stai chiamando JsonConvert.SerializeObject() per convertirli in stringhe JSON, che poi aggiungi a un risultato JsonObject.Quindi chiami ToJson() sul risultato, che presumibilmente serializza nuovamente il tutto su JSON.

JsonObject non fa parte di Json.Net, mentre JsonConvert lo è, quindi consiglierei di utilizzare l'uno o l'altro.In genere, vuoi semplicemente accumulare tutto in un singolo oggetto risultato e quindi serializzare il tutto una volta alla fine.Ecco come lo farei con Json.Net utilizzando un oggetto anonimo per contenere il risultato:

var result = new 
{ 
    Towns = GetDataTableTowns(),
    GLDesc = GetDataTableGLDesc() 
};

string json = JsonConvert.SerializeObject(result);
return Encoding.UTF8.GetBytes(json);

Ecco l'output:

{
    "Towns":[{"Column1":"ANSONIA"},{"Column1":"BETHANY"},{"Column1":"BLOOMFIELD"}],
    "GLDesc":[{"Column1":"Commercial"},{"Column1":"Industrial"},{"Column1":"Public"}]
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top