Caratteri imprevisti di Json.Net (“\”) durante la serializzazione delle mie quadro

Sto usando l’eccellente libreria Json.Net per serializzare le mie entity framework generate dal framework di entity framework. Io uso il seguente codice per farlo:

using (MyVoucherEntities context = new MyVoucherEntities()) { List list = context.MyObjects.ToList(); string json = JsonConvert.SerializeObject(list); } 

Tutto va bene, voglio dire, gli oggetti sono serializzati correttamente tranne che per uno: aggiunge caratteri di escape “\” che mi fanno avere un incubo quando deserializza dal lato client.

  [ { \"$id\": \"1\", \"CreationDate\": \"\\\/Date(1293186324257+0000)\\\/\", \"ImageUrl\": \"http:\/\/www.google.com\", \"Title\": \"Here is a title\" } ] 

Qualcuno sa perché e come posso sbarazzarmi di questi escape caratteri “\”?

Sospetto che in realtà non aggiunga affatto personaggi di escape. Sospetto che tu stia solo guardando la stringa in un debugger e questo aggiunge l’escape.

Prova a scaricarlo su un file o sulla console.

Ho trovato il motivo per cui ho avuto caratteri di escape nella mia stringa ( "\" ). Dopo aver serializzato i miei oggetti, restituisco la stringa JSON all’app client tramite WCF. Apparentemente, WCF aggiunge automaticamente questi caratteri alla stringa prima di inviarla alla rete. È un comportamento predefinito ed è apparentemente obbligatorio.

Dato che non volevo questi caratteri di escape, la soluzione alternativa è di cambiare il tipo di ritorno del servizio in Stream e quindi, restituendo la stringa JSON all’interno di un stream di memoria. Funziona perfettamente ed è abbastanza veloce.

È un JSON non valido perché il risultato della serializzazione di un elenco di oggetti è un array, ovvero, il json inizierà con un [ e finirà con un ] . Per risolvere questo problema, è necessario avvolgere l’elenco di oggetti in un object radice (qualsiasi istanza di una class o di un object anonimo), quindi la stringa risultante inizierà con un { e terminerà con } .

Per esempio:

 var output = new List(); var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented); Response.Write(json); 

Devo notare che non hai completamente citato la roba prodotta (ho avuto l’url per funzionare nella tua risposta) che avrebbe dovuto essere modificato nella tua domanda piuttosto che metterla come risposta). La stringa che ho trovato in un file era questa:

 "[{\"$id\":\"1\",\"CreationDate\":\"\\\/Date(1293186324257+0000)\\\/\",\"ImageUrl\":\"http:\/\/www.c-tina.com\/MyVoucherAdmin\/Images\/shop22\/burger.jpg\",\"Title\":\"Get one burger for free\",\"Description\":\"Bla lbzlfpzkfgmzke\\rdmjdgmj\\r\\r\\rlgfpzkegmkzepk\",\"ShopId\":22,\"PromotionId\":15,\"Shop\":null,\"Features\":[],\"SingleStats\":[],\"WhatsHots\":[],\"EntityKey\":{\"$id\":\"2\",\"EntitySetName\":\"Promotions\",\"EntityContainerName\":\"MyVoucherEntities\",\"EntityKeyValues\":[{\"Key\":\"PromotionId\",\"Type\":\"System.Int32\",\"Value\":\"15\"}]}}]" 

la cosa fondamentale per me è che ci sono citazioni senza fine davanti e alla fine che mi fanno pensare che qualunque cosa stia emettendo è decidere che deve essere citato e se lo si circonda tra virgolette devi sfuggire alle citazioni che ci sono dentro .

Senza vedere l’output completo è difficile dire se il problema è nel codice che hai citato sopra per generare il JSON o se c’è un problema in una fase successiva dell’elaborazione di questo che sta causando il quoting. Hai eseguito il debug e confermato che l’output della tua chiamata serialize sta sicuramente producendo la versione di escape piuttosto che essere eseguita in una fase successiva potenzialmente? Se non sei abituato al debugger allora fai attenzione al suggerimento di Jon Skeet di scaricarlo su file o console per assicurarti che non ci sia confusione in questo modo.

Questo aiuta? L’ho usato nel mio WebService per restituire il contenuto di Json:

 private HttpContent ConvertToJsonContent(object content) { string jsonObject = JsonConvert.SerializeObject(content, Newtonsoft.Json.Formatting.Indented); return new StringContent(jsonObject, Encoding.UTF8, "application/json"); } 

Se le stringhe hanno un “\”, i due “\\” torneranno. Puoi evitarlo usando Unescape

 private HttpContent ConvertToJsonContent(object content) { string jsonObject = Regex.Unescape(JsonConvert.SerializeObject(content, Newtonsoft.Json.Formatting.Indented)); return new StringContent(jsonObject, Encoding.UTF8, "application/json"); }