Il parser JSON.NET * sembra * raddoppiare serializzando i miei oggetti

Il mio problema è questo:

Questa è la risposta inviata dal mio controller WebAPI.

"[ [ {\"id\":\"identifier\"}, {\"name\":\"foobar\"} ] ]" 

Si noti che la risposta è racchiusa tra virgolette e tutte le citazioni incorporate sono sottoposte a escape. Questo è ovviamente un problema. Esistono impostazioni che posso fornire al serializzatore JSON.NET per evitare che ciò si verifichi?

modificare

Come pensava pswg nella sua risposta, stavo usando JSON.NET

 JsonConvert.SerializeObject(instance) 

per eseguire la mia serializzazione.

L’ho fatto perché mentre stavo sviluppando i miei convertitori personalizzati li avevo inclusi nelle impostazioni JsonConvert.Default all’interno del mio WepApiConfig (e ovviamente pensavo che questo non sarebbe stato un problema)

In precedenza avevo provato a scambiare il tipo di ritorno dei miei HttpGets con “il mio tipo di object” e la risposta era una rappresentazione json del metodo ToString () del mio object … che mi ha fatto sapere che la serializzazione non passava attraverso i miei convertitori.

Cambiare il tipo di ritorno dei miei HttpGets da stringa a “il mio tipo di object” e colbind questi convertitori direttamente in HttpConfiguration di WebAPi ha fatto il trucco.

 config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new FooConverter()); config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new BarConverter()); 

Vai tranquillo.

Probabilmente hai qualcosa del genere:

 public string GetFoobars() { var foobars = ... return JsonConvert.SerializeObject(foobars); } 

In questo caso, serializzi l’object in una stringa con Json.NET, quindi restituendo il risultato come stringa, il controller API serializzerà la stringa come stringa letterale JavaScript, il che causerà il wrapping della stringa tra virgolette doppie e causare qualsiasi altro carattere speciale all’interno della stringa di escape con un backslash.

La soluzione è semplicemente restituire gli oggetti da soli:

 public IEnumerable GetFoobars() { var foobars = ... return foobars; } 

Questo farà sì che il controller API serializzi gli oggetti usando le sue impostazioni predefinite, il che significa che serializzerà il risultato come XML o JSON a seconda dei parametri passati dal client.

Ulteriori letture

  • Serializzazione JSON e XML in API Web ASP.NET