Sto cercando di inviare un oggetto JSON a un webservice asp.net.
Il mio json assomiglia a questo:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Sto usando il json2.js per stringere il mio oggetto json.
e sto usando jquery per inviarlo al mio 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);
}
});
Sto ottenendo il seguente errore:
"Primitiva JSON non valida:
Ho trovato un mucchio di post relativi a questo e sembra essere un problema molto comune, ma niente di quello che provo risolve il problema.
Quando firebug cosa viene inviato al server appare così:
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
La mia funzione webservice che viene chiamata è:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
Hai menzionato l'uso di json2.js per stringere i tuoi dati, ma i dati postati sembrano essere URLEncoded JSON Potresti averlo già visto, ma questo post sulla primitiva JSON non valida copre perché il JSON è URLEncoded.
Io ti sconsiglio *di passare una stringa JSON grezza e serializzata manualmente nel tuo metodo. ASP.NET deserializza automaticamente i dati POST della richiesta, quindi se stai serializzando manualmente e inviando una stringa JSON ad ASP.NET, finirai per dover serializzare JSON la tua stringa serializzata JSON.
Suggerirei qualcosa di più lungo queste linee:
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);
}
});
La chiave per evitare il problema della primitiva JSON non valida è passare a jQuery una stringa JSON per il parametro data
, non un oggetto JavaScript, in modo che jQuery non tenti di URLEncode i tuoi dati.
Sul lato server, fai corrispondere i parametri di input del tuo metodo alla forma dei dati che stai passando:
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.";
}
Puoi anche accettare un array, come Marker[] Markers
, se preferisci. Il deserializzatore che ASMX ScriptServices usa (JavaScriptSerializer) è abbastanza flessibile, e farà il possibile per convertire i tuoi dati di input nel tipo di server-side che specifichi.
markers
non è un oggetto JSON. È un normale oggetto JavaScript.data:
:
Dati da inviare al server. Viene convertito in una stringa di interrogazione, se non è già una stringa.Se vuoi inviare i dati come JSON, devi prima codificarli:
data: {markers: JSON.stringify(markers)}
jQuery non converte automaticamente gli oggetti o gli array in JSON.
Ma presumo che il messaggio di errore provenga dall'interpretazione della risposta del servizio. Il testo inviato non è JSON. Le stringhe JSON devono essere racchiuse tra doppi apici. Quindi dovresti fare:
return "\"received markers\"";
Non sono sicuro che il tuo vero problema sia l'invio o la ricezione dei dati.
Ho incontrato anche questo e questa è la mia soluzione.
Se stai incontrando un'eccezione per un oggetto json non valido quando analizzi i dati, anche se sai che la tua stringa json è corretta, stringi i dati che hai ricevuto nel tuo codice ajax prima di analizzarli in 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 ...