web-dev-qa-db-fra.com

Caractères inattendus Json.Net ("\") lors de la sérialisation de mes entités

J'utilise l'excellente bibliothèque Json.Net pour sérialiser mes entités générées par le cadre d'entité. J'utilise le code suivant pour le faire:

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

Tout se passe bien je veux dire, les objets sont correctement sérialisés sauf une pensée: cela ajoute des caractères d'échappement "\" qui me rend cauchemardesque lors de la désérialisation côté client.

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

Quelqu'un sait-il pourquoi et comment je peux me débarrasser de ces caractères d'échappement slash "\"?

21
Renaud

J'ai trouvé la raison pour laquelle j'avais des caractères d'échappement dans ma chaîne ("\"). Après la sérialisation de mes objets, je renvoie la chaîne JSON à l'application cliente via un fichier WCF. Apparemment, WCF ajoute automatiquement ces caractères à la chaîne avant de l'envoyer au réseau. C'est un comportement par défaut et est apparemment obligatoire.

Comme je ne voulais pas de ces caractères d'échappement, la solution consiste à changer le type de retour du service en Stream et ainsi, en renvoyant votre chaîne JSON dans un flux de mémoire. Cela fonctionne parfaitement et est assez rapide.

14
Renaud

Je soupçonne que ce n'est pas en fait ajouter des caractères d'échappement du tout. Je suppose que vous ne faites que regarder la chaîne dans un débogueur, et c'est en ajoutant l'échappement.

Essayez de le transférer dans un fichier ou la console.

27
Jon Skeet

JSON invalide car le résultat de la sérialisation d’une liste d’objets est un tableau, c’est-à-dire que le JSON commencera par un [ et se terminera par un ]. Pour résoudre ce problème, vous devez envelopper la liste d'objets dans un objet racine (toute instance d'une classe ou un objet anonyme). La chaîne résultante commencera par un { et se terminera par }.

Par exemple:

var output = new List<object>();
var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented);
Response.Write(json);
3
Jone Polvora

Je devrais noter que vous n’avez pas complètement cité le texte sorti (j’ai eu l’URL à utiliser dans votre réponse - cela aurait dû être intégré dans votre question plutôt que de le mettre en réponse). La chaîne que j'ai récupérée dans un fichier était la suivante:

"[{\"$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\"}]}}]"

pour moi, l’essentiel est qu’il y ait des citations non échappées au début et à la fin, ce qui me fait penser que quoi qu’il en soit, il décide de le citer et si vous l’entourez entre guillemets, vous devez échapper aux citations qui se trouvent à l’intérieur .

Sans voir la sortie complète, il est difficile de dire si le problème vient du code que vous avez cité ci-dessus pour générer le JSON ou s'il y a un problème lors d'une étape ultérieure du traitement de ce qui provoque la citation. Avez-vous débogué et confirmé que la sortie de votre appel de sérialisation produisait définitivement la version échappée plutôt que potentiellement effectuée ultérieurement? Si vous n'êtes pas habitué au débogueur, faites attention à la suggestion de Jon Skeet de le transférer dans un fichier ou une console pour éviter toute confusion de cette façon.

1
Chris

Est-ce que celui-ci aide? Je l'ai utilisé dans mon WebService pour retourner du contenu Json:

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

Si les chaînes ont un "\", les deux "\\" reviendront. Vous pouvez éviter cela en utilisant 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");
}
1
Mickey Mouse