J'essaie de publier un objet JSON sur un service Web asp.net.
Mon json ressemble à ceci:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
J'utilise le json2.js pour stringyfy mon objet json.
et j'utilise jquery pour le poster sur mon webservice.
$.ajax({
type: "POST",
url: "/webservices/PodcastService.asmx/CreateMarkers",
data: markers,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert(data);},
failure: function(errMsg) {
alert(errMsg);
}
});
Je reçois l'erreur suivante:
"Primitive JSON non valide:
J'ai trouvé un tas de messages à ce sujet et cela semble être un problème vraiment courant, mais rien que j'essaie ne résout le problème.
Lorsque Firebug ce qui est publié sur le serveur, cela ressemble à ceci:
marqueurs% 5B0% 5D% 5Bposition% 5D = 128.3657142857143 & marqueurs% 5B0% 5D% 5BmarkerPosition% 5D = 7 & marqueurs% 5B1% 5D% 5Bposition% 5D = 235.1944023323615 & marqueurs% 5B1% 5D% 5BmarkerPosition% 5D% 5B = 19% 5D = 42,5978231292517 & marqueurs% 5B2% 5D% 5BmarkerPosition% 5D = -3
Ma fonction de service Web appelée est:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
la source
Réponses:
Vous avez mentionné l'utilisation de json2.js pour stringifier vos données, mais les données POSTed semblent être JSON URLEncodé Vous l'avez peut-être déjà vu, mais ce post sur la primitive JSON invalide explique pourquoi le JSON est URLEncodé.
Je conseille contre le passage d' une première, chaîne JSON sérialisé manuellement dans votre méthode . ASP.NET va automatiquement désérialiser JSON les données POST de la demande, donc si vous sérialisez et envoyez manuellement une chaîne JSON à ASP.NET, vous finirez par devoir JSON sérialiser votre chaîne sérialisée JSON.
Je suggère quelque chose de plus dans ce sens:
La clé pour éviter le problème de primitive JSON non valide est de transmettre à jQuery une chaîne JSON pour le
data
paramètre, pas un objet JavaScript, afin que jQuery n'essaye pas d'URLEncode vos données.Côté serveur, faites correspondre les paramètres d'entrée de votre méthode à la forme des données que vous transmettez:
Vous pouvez également accepter un tableau, comme
Marker[] Markers
, si vous préférez. Le désérialiseur utilisé par ASMX ScriptServices (JavaScriptSerializer) est assez flexible et fera ce qu'il peut pour convertir vos données d'entrée dans le type côté serveur que vous spécifiez.la source
contentType
est-il envisagé si nous utilisons GET et non POST?markers
n'est pas un objet JSON. Il s'agit d'un objet JavaScript normal.data:
option :Si vous souhaitez envoyer les données au format JSON, vous devez d'abord les coder:
jQuery ne convertit pas automatiquement les objets ou les tableaux en JSON.
Mais je suppose que le message d'erreur provient de l'interprétation de la réponse du service. Le texte que vous renvoyez n'est pas JSON. Les chaînes JSON doivent être placées entre guillemets. Il faudrait donc faire:
Je ne sais pas si votre problème réel est l'envoi ou la réception des données.
la source
markers
tant que chaîne JSON?J'ai essayé la solution de Dave Ward. La partie de données n'était pas envoyée par le navigateur dans la partie de la charge utile de la demande de publication, car le contentType est défini sur
"application/json"
. Une fois que j'ai supprimé cette ligne, tout fonctionnait très bien.la source
J'ai rencontré celui-ci aussi et c'est ma solution.
Si vous rencontrez une exception d'objet json non valide lors de l'analyse des données, même si vous savez que votre chaîne json est correcte, chaînez les données que vous avez reçues dans votre code ajax avant de les analyser en JSON:
la source
J'ai une requête,
Je publie les informations de connexion dans json et j'obtiens une chaîne en tant que
"Success"
, mais je n'obtiens pas de réponse.la source
Veuillez suivre ceci par un appel ajax au service Web de java var param = {feildName: feildValue}; JSON.stringify ({data: param})
la source