Jquery Ajax Invio di json al servizio web


238

Sto cercando di pubblicare un oggetto JSON su un servizio web asp.net.

Il mio json si presenta così:

var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};

Sto usando json2.js per stringyfy il mio oggetto json.

e sto usando jquery per pubblicarlo sul mio servizio web.

  $.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);
        }
  });

Ricevo il seguente errore:

"Primitiva JSON non valida:

Ho trovato un sacco di post relativi a questo e sembra essere un problema molto comune, ma nulla che provo risolva il problema.

Quando si esegue il firebug, ciò che viene pubblicato sul server è simile al seguente:

marcatori% 5B0% 5D% 5Bposition% 5D = 128,3657142857143 & marcatori% 5B0% 5D% 5BmarkerPosition% 5D = 7 & marcatori% 5B1% 5D% 5Bposition% 5D = 235,1944023323615 & marcatori% 5B1% 5D% 5BmarkerPosition% 5D = 19 e marcatori% 5B2% 5D% 5Bposition% 5D = 42,5978231292517 & marcatori% 5B2% 5D% 5BmarkerPosition% 5D = -3

La mia funzione di servizio web che viene chiamata è:

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}

'fallimento' non è fornito come possibile impostazione tra quelli elencati in api.jquery.com/jQuery.ajax ... forse hai sbagliato con 'errore' invece?
Danicotra,

Risposte:


390

Hai menzionato l'uso di json2.js per stringere i tuoi dati, ma i dati POST sembrano essere JSON URLEncoded Potresti averlo già visto, ma questo post sulla primitiva JSON non valida copre il motivo per cui JSON è stato URLEncoded.

Vorrei consigliare contro passando una corda grezza manualmente serializzato JSON nel vostro metodo di . ASP.NET sta per deserializzare 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ù in questo senso:

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 file data parametro, non un oggetto JavaScript, in modo che jQuery non tenti di URLEncode i tuoi dati.

Sul lato server, abbina 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 utilizzato da ASMX ScriptServices (JavaScriptSerializer) è piuttosto flessibile e farà il possibile per convertire i dati di input nel tipo lato server specificato.


4
Hai scritto "in modo che jQuery non tenti di URLEncode i tuoi dati", ma non è corretto. Per impedire a jquery di urlencoding dei dati è necessario impostare processData su false.
Softlion,

8
Il passaggio in una stringa è sufficiente per impedire a jQuery di URLEncoding del parametro data. Puoi impostare processData su false, ma è superfluo (e farlo da solo, senza passare una stringa JSON per i dati, non è abbastanza).
Dave Ward,

1
Lo stesso problema (e risposta) si applica anche a Rails.
GregT

2
@DaveWard contentTypeÈ considerato se usiamo GET e non POST?
Royi Namir,

@RoyiNamir Se si utilizzano ASMX ScriptServices o ASPX WebMethods, è necessario utilizzare POST per ottenere la restituzione di JSON. Se OTTIENI, Content-Type corretto o no, otterrai invece XML.
Dave Ward,

19
  1. markersnon è un oggetto JSON. È un normale oggetto JavaScript.
  2. Leggi data:sull'opzione :

    Dati da inviare al server. Viene convertito in una stringa di query , se non già una stringa.

Se vuoi inviare i dati come JSON, devi prima codificarli:

data: {markers: JSON.stringify(markers)}

jQuery non converte automaticamente oggetti o matrici in JSON.


Ma suppongo che il messaggio di errore provenga dall'interpretazione della risposta del servizio. Il testo che rispedisci non è JSON. Le stringhe JSON devono essere racchiuse tra virgolette doppie. Quindi dovresti fare:

return "\"received markers\"";

Non sono sicuro che il tuo vero problema sia l'invio o la ricezione dei dati.


Grazie per l'aiuto Felix, ho pensato che eseguendo marcatori tramite il metodo JSON.stringyfy lo stavo convertendo in una stringa di query, ho fatto come hai suggerito, ma sfortunatamente non funziona, non sto postando quanto segue.
Codice Faraone,

marcatori =% 7B% 22markers% 22% 3A% 5B% 7B% 22position% 22% 3A% 22.128,3657142857143% 22% 2C% 22markerPosition% 22% 3A% 227% 22% 7D% 2C% 7B% 22position% 22% 3A% 22.235,1944023323615 % 22% 2C% 22markerPosition% 22% 3A% 2219% 22% 7D% 2C% 7B% 22position% 22% 3A% 2.242,5978231292517% 22% 2C% 22markerPosition% 22% 3A% 22-3% 22% 7D% 5D% 7D
Codice Faraone,

@Dreamguts: Non è chiaro per me quello che vuoi. Vuoi inviare markerscome stringa JSON?
Felix Kling,

Ciao Felix, sì, voglio inviare l'oggetto marker come stringa JSON in modo da poterlo utilizzare nel mio servizio web.
Codice Faraone,

@Dreamguts: Quindi dovrebbe funzionare in questo modo. Anche il "codice" che hai pubblicato nel commento sembra ok. Ovviamente devi decodificarlo correttamente sul lato server e forse devi cambiare il nome del parametro, non lo so.
Felix Kling,

3

Ho provato la soluzione di Dave Ward. La parte di dati non veniva inviata dal browser nella parte di payload della richiesta di post come contentType è impostato su "application/json". Una volta rimossa questa riga, tutto ha funzionato alla grande.

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);
    }
});

2

Ho incontrato anche questo e questa è la mia soluzione.

Se si verifica un'eccezione di oggetto json non valida durante l'analisi dei dati, anche se si sa che la stringa JSON è corretta, stringere i dati ricevuti nel codice Ajax prima di analizzarli su 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 ...

1

Ho una domanda,

$("#login-button").click(function(e){ alert("hiii");

        var username = $("#username-field").val();
        var password = $("#username-field").val();

        alert(username);
        alert("password" + password);



        var markers = { "userName" : "admin","password" : "admin123"};
        $.ajax({
            type: "POST",
            url: url,
            // The key needs to match your method's input parameter (case-sensitive).
            data: JSON.stringify(markers),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data){alert("got the data"+data);},
            failure: function(errMsg) {
                alert(errMsg);
            }
        });

    });

Sto pubblicando i dettagli di accesso in json e "Success"ricevo una stringa come , ma non ricevo la risposta.


1
Questa non è la risposta alla domanda. Se vuoi porre la domanda, vai nel menu "Domanda" e fai clic su "Poni domanda", e se la tua domanda è correlata a questa domanda, fornisci il link di riferimento nella tua domanda.
Mittal Patel,

-2

Per favore, segui questo tramite una chiamata ajax al servizio web di java var param = {feildName: feildValue}; JSON.stringify ({data: param})

$.ajax({
            dataType    : 'json',
            type        : 'POST',
            contentType : 'application/json',
            url         : '<%=request.getContextPath()%>/rest/priceGroups',
            data        : JSON.stringify({data : param}),
            success     : function(res) {
                if(res.success == true){
                    $('#alertMessage').html('Successfully price group created.').addClass('alert alert-success fade in');
                    $('#alertMessage').removeClass('alert-danger alert-info');
                    initPriceGroupsList();
                    priceGroupId = 0;
                    resetForm();                                                                    
                }else{                          
                    $('#alertMessage').html(res.message).addClass('alert alert-danger fade in');
                }
                $('#alertMessage').alert();         
                window.setTimeout(function() { 
                    $('#alertMessage').removeClass('in');
                    document.getElementById('message').style.display = 'none';
                }, 5000);
            }
        });

qui come elencare l'oggetto passare in json alla chiamata ajax di java webservice.
Ravi Panchal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.