2011-03-13 17 views
53

Ho problemi a recuperare il contenuto dell'oggetto JSON da una chiamata JQery.ajax. Il mio invito:Parse JSON da JQuery.ajax dati di successo

$('#Search').click(function() { 
    var query = $('#query').valueOf(); 
    $.ajax({ 
     url: '/Products/Search', 
     type: "POST", 
     data: query, 
     dataType: 'application/json; charset=utf-8', 
     success: function (data) { 
      alert(data); 
      for (var x = 0; x < data.length; x++) { 
       content = data[x].Id; 
       content += "<br>"; 
       content += data[x].Name; 
       content += "<br>"; 
       $(content).appendTo("#ProductList"); 
       // updateListing(data[x]); 
      } 
     } 
    }); 
}); 

Sembra che l'oggetto JSON viene restituito correttamente perché "alert (dati)" visualizza il seguente

[{"Id": "1", "Name": "Shirt"}, {"Id": "2", "Name":"Pants"}] 

ma quando provo visualizza l'ID o il nome della pagina utilizzando :

content = data[x].Id; 
content += "<br>"; 
content += data[x].Name; 
content += "<br>"; 

restituisce "non definito" alla pagina. Che cosa sto facendo di sbagliato?

Grazie per l'aiuto.

+5

documentazione aiuta. http://api.jquery.com/jQuery.ajax/ mostra che ''application/json; charset = utf-8'' non è un valore valido per 'dataType'. –

+0

Converti in JSON da JSON.parse() –

risposta

78

I dati tornano come rappresentazione di stringa del JSON e non si sta convertendo nuovamente in un oggetto JavaScript. Impostare dataType su 'json' per convertirlo automaticamente.

+4

@DipakYadav: 'getJSON' non POST. –

+6

@MarceloCantos (sulla tua risposta): questo è vero. Tuttavia, in base a [jQuery Manual] (http://api.jquery.com/jQuery.ajax/), "viene rifiutato qualsiasi JSON malformato e viene generato un errore di analisi. A partire da jQuery 1.9, viene respinta anche una risposta vuota_" . Quindi puoi usare 'dataType: 'json'' solo, se sei sicuro, che il server restituirà JSON formattato in modo errato. Se restituisce solo "stringa, che assomiglia a JSON_", dovresti usare 'dataType:" text json "' per forzare la conversione di jQuery. – trejder

+0

intestazione ('Content-Type: application/json'); se usi php –

2

Provare la jquery each funzione di camminare attraverso il vostro oggetto JSON:

$.each(data,function(i,j){ 
    content ='<span>'+j[i].Id+'<br />'+j[i].Name+'<br /></span>'; 
    $('#ProductList').append(content); 
}); 
5

Beh ... sono circa 3/4 del modo in cui si ... avete già il vostro JSON come testo.

Il problema è che sembra che si stia gestendo questa stringa come se fosse già un oggetto JavaScript con proprietà relative ai campi che sono stati trasmessi.

Non è ... è solo una stringa.

Query come "content = data [x] .Id;" sono destinati a fallire perché JavaScript non sta trovando queste proprietà collegate alla stringa che sta guardando ... di nuovo, è una stringa JUST.

Si dovrebbe essere in grado di analizzare semplicemente i dati come JSON tramite ... sì ... il metodo di analisi dell'oggetto JSON.

myResult = JSON.parse(request.responseText); 

Ora myResult è un oggetto javascript contenente le proprietà trasmesse tramite AJAX.

Ciò dovrebbe consentire di gestirlo nel modo in cui sembra provarlo.

Sembra che JSON.parse sia stato aggiunto quando ECMA5 è stato aggiunto, quindi qualsiasi cosa abbastanza moderna dovrebbe essere in grado di gestirlo in modo nativo ... se devi gestire i fossili, potresti anche provare le librerie esterne per gestire questo, come jQuery oppure JSON2.

Per la cronaca, questo è stato già risposto da Andy E per qualcun altro HERE.

modifica - Ha visto la richiesta di 'fonti ufficiali o credibili', e, probabilmente, uno dei programmatori che trovo il più credibile sarebbe John Resig ~ ECMA5 JSON ~ avrei legato alla specifica attuale ECMA5 riguardo nativo JSON supporto, ma preferirei riferire qualcuno a un master come Resig piuttosto che una specifica secca.

51

vi consiglio di utilizzare:

var returnedData = JSON.parse(response); 

per convertire la stringa JSON (se è solo testo) a un oggetto JavaScript.

+1

@RyanGates, credo che abobreshov stia parlando di 'success: function (data) {data = JSON.parse (data);}', se non sbaglio. – trejder

+0

Certo, intendevo – abobreshov

3

è possibile utilizzare il metodo di jQuery parseJSON:

var Data = $.parseJSON(response); 
6

Uno dei modi è possibile garantire che questo tipo di errore (utilizzando stringa invece di JSON) non accade è quello di vedere ciò che viene stampato nel alert. Quando lo fai

alert(data) 

se i dati sono una stringa, stamperà tutto ciò che è contenuto. Tuttavia se si stampa è json object. si ottiene la seguente risposta in allerta

[object Object] 

Se questa la risposta, allora si può essere sicuri che è possibile utilizzare questo come un oggetto JSON (in questo caso).

Pertanto, è necessario per convertire la stringa in JSON prima, prima di utilizzarlo in questo modo:

JSON.parse(data) 
0

Dal API jQuery: con l'impostazione di dataType, se non viene specificato, jQuery cercherà di dedurlo con $.parseJSON() in base al tipo MIME (il tipo MIME per il testo JSON è "application/json") della risposta (in 1.4 JSON produrrà un oggetto JavaScript).

Oppure è possibile impostare dataType su json per convertirlo automaticamente.

0

Non sono sicuro che cosa sta andando storto con il tuo set up. Forse il server non sta impostando correttamente le intestazioni. Non sono sicuro. Come un colpo lungo, si può provare questo

$.ajax({ 
    url : url, 
    dataType : 'json' 
}) 
.done(function(data, statusText, resObject) { 
    var jsonData = resObject.responseJSON 
}) 
3

E 'un lavoro, ad esempio

.ajax({ 

      url: "http://localhost:11141/Search/BasicSearchContent?ContentTitle=" + "تهران", 
      type: 'GET', 
      cache: false, 
      success: function (result) { 

       // alert(jQuery.dataType); 
       if (result) { 
        // var dd = JSON.parse(result); 
        alert(result[0].Id) 
       } 

      }, 
      error: function() { 
       alert("No"); 
      } 
     }); 

Infine, è necessario utilizzare questa istruzione ...

result[0].Whatever