2011-08-15 4 views
7

J'ai une action retournant un simple json. À des fins de démonstration, je vais coller l'exemple de code. classe simple sérialiser:guillemets doubles dans renvoyé json

public class Employee 
{ 
    public string FullName { get; set; } 
} 

L'action qui renvoie le JSON:

public JsonResult Test() 
{ 
    var employee = new Employee { FullName = "Homer Simpson" }; 
    var serializer = new JavaScriptSerializer(); 
    var json = serializer.Serialize(employee); 

    return Json(json, JsonRequestBehavior.AllowGet); 
} 

Voici où je suis confus. Quand j'appelle cette action à partir du navigateur et de regarder la réponse avec Fiddler, voici le résultat:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Mon, 15 Aug 2011 20:52:34 GMT 
X-AspNet-Version: 4.0.30319 
X-AspNetMvc-Version: 3.0 
Cache-Control: private 
Content-Type: application/json; charset=utf-8 
Content-Length: 34 
Connection: Close 

"{\"FullName\":\"Homer Simpson\"}" 

L'onglet « JSON » dans Fiddler lit « La réponse sélectionnée ne contient pas de texte valide JSON ». La réponse valide devrait être comme ceci:

"{"FullName":"Homer Simpson"}" 

Ce qui se passe ici? Merci

+1

' "{\" FullName \ ": \" Homer Simpson \ "}"' est la version échappée de l'objet JSON à chaînes. Quand il est analysé, le moteur le transformera en '{" FullName ":" Home Simpson "}'. Parce qu'il est entouré de guillemets hors des accolades, les guillemets internes doivent être échappés ou vous aurez une chaîne invalide. –

+0

Je comprends cela, mais ne devriez pas fiddler analyser la chaîne retournée dans l'objet JSON et montrer le JSON dans l'onglet JSON? –

Répondre

16

Vous n'avez pas besoin de sérialisation en JSON-vous, cela devrait faire:

public JsonResult Test() { 
    var employee = new Employee { FullName = "Homer Simpson" }; 
    return Json(employee, JsonRequestBehavior.AllowGet); 
} 

Votre code sérialise efficacement deux fois, ce qui vous donne un résultat de chaîne.

La réponse valide devrait effectivement être ceci:

{"FullName":"Homer Simpson"} 

(sans les guillemets)

+0

Maintenant, c'est logique! Merci. –

+0

+1 pour Homer Simpson lol –

Questions connexes