2009-04-06 24 views
15

Viene visualizzato un errore di analisi quando si utilizza jQuery per caricare alcuni dati JSON. Ecco un frammento del mio codice:jQuery.ajax() + oggetto JSON vuoto = errore di analisi

jQuery.ajax({ 
    dataType: "json", 

    success: function (json) 
    { 
     jQuery.each(json, function() 
     { 
      alert(this["columnName"]); 
     }); 
    } 
}); 

ricevo errori durante l'analisi di un oggetto JSON non vuoto. Quindi la mia ipotesi è che il problema sia con il mio serializzatore.


domanda è: Come faccio a formattare un oggetto JSON vuoto che jQuery non prenderà in considerazione malformati?

questo è quello che ho provato finora, senza successo:

{[]} 

{[null]} 

{} 

{null} 


{"rows": []} 

{"rows": null} 

{"rows": {}} 



UPDATE:

Posso capire che sono stato un po 'vago - lasciare mi prova e chiarisco:

L'analisi dell'oggetto JSON non è il problema qui - JQuery è - penso.

jQuery genera un errore di analisi (richiama la funzione di errore). Sembra che la validazione JSON interna di jQuery non accetti nessuno degli oggetti menzionati prima. Nemmeno quelli validi.

Uscita della funzione di errore è:

XMLHttpRequest: XMLHttpRequest readyState=4 status=200
textStatus: parsererror
errorThrown: undefined

Questo vale per tutti gli oggetti summenzionati.

+0

Questo è il problema con sottoinsiemi, essi don ce l'ho tutto –

+0

tutti tranne il 3 ° esempio non sono JSON validi, in quanto non è presente alcuna chiave nel dizionario – cobbal

+0

Aggiornamento con altri tentativi. Ancora ricevendo errori di analisi. – roosteronacid

risposta

1

Invece di:

$(json).each(function() { ... }); 

Penso che si desidera di utilizzare:

$.each(json, function() { ... }); 

Dal jQuery.each documentation:

This function is not the same as $().each() - which is used to iterate, exclusively, over a jQuery object. This function can be used to iterate over anything.

+0

Type'o.Ma grazie - modificato e salvato. Non è davvero una risposta però. – roosteronacid

1

Ti è verificare se il JSON viene restituito correttamente il primo posto prima di ciascuno? Imposta il valore vuoto come {} e verifica se è così prima .each

Inoltre, sarebbe utile sapere come è il tuo JSON quando ci sono dati.

2

siete alla ricerca di questo:

[] 

un array vuoto. Cioè, se hai intenzione di iterarlo subito, allora quello che ti serve è un array.

5

Innanzitutto {[]}, {[null]} e {null} non funzionerà perché sono tutti oggetti JSON non validi (come verificato dal JSON validator).

Gli oggetti rimanenti sono tutti oggetti JSON validi, pertanto è necessario richiamare la funzione success.

Se si passa un oggetto oggetto non array o array, la funzione each enumera l'oggetto json in base alle proprietà denominate. Nel caso dei tre oggetti che ciascuno ha una proprietà rowsthis verrà impostato su [], null e {} rispettivamente, nessuno dei quali ha un attributo columnName in modo da generare un errore non definito.

L'oggetto {} non ha alcuna proprietà, pertanto non dovrebbe causare un errore perché la chiamata each effettuerà il ciclo 0 volte. Cosa mostra la seguente riga se la aggiungi come prima riga nella tua funzione success?

alert(typeof json + ' ' + (json == null)); 
2

Il servizio Web potrebbe restituire null. Ho trovato che restituire null da una chiamata al servizio web restituisce una risposta con il codice di stato 200, "Ok", ma jQuery in seguito lancia un parseerror.

Se questo è il caso, non ha nulla a che fare con ciò che si sta inviando al server, e tutto ciò che il server sta rinviando.

Se è possibile modificare il servizio Web, è possibile provare a restituire un oggetto JSON vuoto o un valore predefinito anziché Null. In alternativa, è possibile verificare questo scenario di errore nel gestore degli errori, sapendo che ciò significa che la chiamata ha restituito nulla.

0

Si sono verificati problemi simili durante la richiesta di JSON valido dal server.

Il mio server era in servizio il tipo di contenuto text/javascript

non stavo usando l'impostazione jQuery.ajax facoltativa di 'tipo di dati' in modo jQuery è stato interpretting uscita un javascript (ad esempio imbottita JSON), non è pulito JSON.

Aggiunta di un dataType: 'JSON' all'oggetto delle impostazioni passato al metodo ajax di jQuery ha risolto il problema.

0

Aveva anche questo problema e l'ho risolto utilizzando il jsonserializer nel mio servizio web per formattare una stringa vuota. il risultato è stato "\" \ "" essenzialmente "";

9

La soluzione è quella di restituire un codice di stato 204 piuttosto che 200 dal server, 204 è "nessun contenuto" e tornerà il successo pur non cercando di richiamare il parser