Ik probeer een JSON object naar een asp.net webservice te sturen.
Mijn json ziet er als volgt uit:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Ik gebruik de json2.js om mijn json object te stringyfyen.
en ik gebruik jquery om het naar mijn webservice te sturen.
$.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);
}
});
Ik krijg de volgende foutmelding:
"Ongeldige JSON primitieve:
Ik heb een heleboel berichten hierover gevonden en het lijkt een veel voorkomend probleem te zijn, maar niets wat ik probeer lost het probleem op.
Wanneer firebug ziet wat er wordt gepost naar de server ziet het er zo uit:
markers%5B0%5D%5Bposition%5D=128.3657142857143&markers%5B0%5D%5BmarkerPosition%5D=7&markers%5B1%5D%5Bposition%5D=235.1944023323615&markers%5B1%5D%5BmarkerPosition%5D=19&markers%5B2%5D%5Bposition%5D=42.5978231292517&markers%5B2%5D%5BmarkerPosition%5D=-3
Mijn webservice functie die wordt aangeroepen is:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
U vermeldde het gebruik van json2.js om uw gegevens te stringificeren, maar de geplaatste gegevens lijken URLEncoded JSON te zijn U hebt het misschien al gezien, maar deze post over de ongeldige JSON primitieve behandelt waarom de JSON URLEncoded wordt.
Ik zou adviseren af te raden een ruwe, handmatig geserialiseerde JSON string door te geven in je methode. ASP.NET gaat automatisch JSON deserialize het verzoek's POST data, dus als je're handmatig serializing en het verzenden van een JSON string naar ASP.NET, you'll eigenlijk eindigen met het hebben van uw JSON serialized string te JSON serialize.
Ik'zou iets meer in deze richting voorstellen:
var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }];
$.ajax({
type: "POST",
url: "/webservices/PodcastService.asmx/CreateMarkers",
// The key needs to match your method's input parameter (case-sensitive).
data: JSON.stringify({ Markers: markers }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert(data);},
failure: function(errMsg) {
alert(errMsg);
}
});
De sleutel tot het vermijden van het ongeldige JSON primitieve probleem is om jQuery een JSON string door te geven voor de data
parameter, niet een JavaScript object, zodat jQuery'niet probeert je gegevens te URLEncoderen.
Aan de server-kant, pas uw methode's input parameters aan de vorm van de gegevens die u're doorgeeft:
public class Marker
{
public decimal position { get; set; }
public int markerPosition { get; set; }
}
[WebMethod]
public string CreateMarkers(List<Marker> Markers)
{
return "Received " + Markers.Count + " markers.";
}
Je kunt ook een array accepteren, zoals Marker[] Markers
, als je dat liever hebt. De deserializer die ASMX ScriptServices gebruikt (JavaScriptSerializer) is vrij flexibel, en zal doen wat hij kan om uw invoer om te zetten in het server-side type dat u opgeeft.
markers
is geen JSON object. Het is een normaal JavaScript object.data:
optie:Gegevens die naar de server moeten worden gestuurd. Het wordt geconverteerd naar een query string, als het niet al een string is.
Als je de data als JSON wilt versturen, moet je het eerst coderen:
data: {markers: JSON.stringify(markers)}
jQuery converteert objecten of arrays niet automatisch naar JSON.
Maar ik neem aan dat de foutmelding komt door het interpreteren van het antwoord van de service. De tekst die je terugstuurt is geen JSON. JSON strings moeten tussen dubbele aanhalingstekens staan. Dus je'zou moeten doen:
return "\"received markers\"";
Ik weet niet zeker of je eigenlijke probleem het verzenden of ontvangen van de gegevens is.
Ik ben deze ook tegengekomen en dit is mijn oplossing.
Als je een ongeldig json object uitzondering tegenkomt bij het parsen van gegevens, ook al weet je dat je json string correct is, stringify dan de gegevens die je hebt ontvangen in je ajax code voordat je ze parseert naar JSON:
$.post(CONTEXT+"servlet/capture",{
yesTransactionId : yesTransactionId,
productOfferId : productOfferId
},
function(data){
try{
var trimData = $.trim(JSON.stringify(data));
var obj = $.parseJSON(trimData);
if(obj.success == 'true'){
//some codes ...