ASP.NET WebService encapsule ma réponse JSON avec des balises XML
Je ne sais pas où je vais mal de ce que je suis absent.
Je suis en train de construire un ASP.NET 2.0 (sur la .Net framework 3.5) de l'application Web et je suis y compris un webservice. Notez que c'est pas un projet MVC. Je souhaite exposer une méthode qui renvoie une chaîne JSON; formaté pour nourrir les jqGrid plugin jQuery.
C'est le préliminaire de la méthode de test j'ai mis en place dans mon service: grâce à (Phil Haack Guide pour MVC)
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string getData()
{
JavaScriptSerializer ser = new JavaScriptSerializer();
var jsonData = new
{
total = 1, //we'll implement later
page = 1,
records = 3, //implement later
rows = new[]{
new {id = 1, cell = new[] {"1", "-7", "Is this a good question?", "yay"}},
new {id = 2, cell = new[] {"2", "15", "Is this a blatant ripoff?", "yay"}},
new {id = 3, cell = new[] {"3", "23", "Why is the sky blue?", "yay"}}
}
};
return ser.Serialize(jsonData); //products.ToString();
}
Lors de l'invocation de cette est de retour (formaté pour plus de clarté):
<?xml version="1.0" encoding="utf-8" ?>
<string mlns="http://tempuri.org/">
{
"total":1,
"page":1,
"records":3,
"rows":
[
{"id":1,"cell":["1","-7","Is this a good question?","yay"]},
{"id":2,"cell":["2","15","Is this a blatant ripoff?","yay"]},
{"id":3,"cell":["3","23","Why is the sky blue?","yay"]}
]
}
</string>
Comment puis-je obtenir la réponse précédente sans le xml emballages?
source d'informationauteur Mike
Vous devez vous connecter pour publier un commentaire.
Trois choses que vous ne pouvez pas faire:
Il y a peut être un moyen d'appeler la méthode avec un GET, je n'ai jamais utilisé de POSTE. J'ai été en mesure d'obtenir votre exemple de travail avec ceci:
Le code derrière (vous n'avez pas besoin de créer un webservice, vous pouvez mettre ceci dans votre défaut.aspx):
Le résultat:
Une explication plus détaillée est ici
Dans votre code, ne le "retour" au format json. Utiliser à la place:
Context.Response.Write(ser.Serialize(jsonData));
Alors vous serez bon.
Le retour régulier de commande aide vous en mettant en plus un service adéquat format. Certains diraient qu'il vaut mieux utiliser le formulaire de cela, et déballer vos json sur le client à partir de ce format. Je dis juste cracher vers le bas les choses exactement comment vous souhaitez l'utiliser!
Lorsque vous marquez le service comme un ScriptService, il gère automatiquement la sérialisation JSON. Vous ne devriez pas manuellement sérialiser la réponse.
Voir cette débordement de la pile d'entrée pour plus de détails.
J'ai eu plus de chance avec la manière suivante:
Il est important de définir le type de contenu correctement, et d'écrire le JSON directement à la réponse, puis à la fin de la réponse, de sorte qu'aucune donnée supplémentaire n'est envoyé à corrompre votre réponse. Un avantage de cette architecture est que vous pouvez utiliser n'importe quel sérialiseur vous le souhaitez, vous n'êtes pas limité à la construction dans le sérialiseur JSON. Dans ce cas, j'ai utilisé Json.NET.
Je me rends compte que c'est abuser de l'architecture (et personnellement, je n'aime pas se faire un vide type de retour pour quelque chose qui est censé renvoyer des données), mais c'est la seule véritable méthode fiable que j'ai trouvé.
D'autre part, vous devriez passer à la WCF ou Web APIpour des raisons John Saunders décrit ici. L'API Web en particulier est très facile à utiliser, et permet un type de contenu de la négociation entre le client et le serveur.
Si vous demandez JSON, et si vous incluez le
[ScriptService]
attribut, ASP.NET automatiquement serialise la réponse en JSON. Que vous avez été voir XML suggère l'une de ces 2 conditions n'étaient pas remplies. Les suggestions pour serialise JSON manuellement sont malsauf si vous souhaitez utiliser un autre serialiser comme Newtonsoft.Voici un simple exemple de travail d'un JSON activé le service web ASMX:
JavaScript pour la demande et des processus de la réponse (nous allons tout simplement pop up un JS alert avec le message de MyClass.Message) :
De la requête Http:
De la réponse HTTP:
Résultat:
"Hi" s'affiche dans un popup JS.
Voir aussi:
https://stackoverflow.com/a/16335022/397817
https://stackoverflow.com/a/3839649/397817