JSON.parse() non funziona

Ho un json dal mio server che è –

{"canApprove": true,"hasDisplayed": false}  

Posso analizzare il json come questo –

var msg = JSON.parse('{"canApprove": true,"hasDisplayed": false}');
alert(msg.canApprove);  //shows true.

A mio ajax funzione di risposta ho preso lo stesso json detto in precedenza da un parametro del metodo jsonObject

//response function
function(jsonObject){

  //here jsonObject contains the same json -  {"canApprove":true,"hasDisplayed": false}
  //But without the surrounding single quote
  //I have confirmed about this by seeing my server side log.

  var msg = JSON.parse(jsonObject); //this gives the error

}

Ma ora ho ottenuto il seguente errore –

SyntaxError: JSON.analizzare: carattere imprevisto alla riga 1, colonna 2, del
dati JSON

Qualcuno può dirmi perché io sono sempre l’errore?

  • console.log(jsonObject) display cosa?
  • Che quasi certamente significa che il JSON è già stato analizzato. Aggiungere console.log(typeof jsonObject); per la tua risposta in funzione a destra prima di provare ad analizzarlo. Scommetto che è “Oggetto”.
  • Si prega di leggere l’intera questione, che sta cercando di analizzare la stringa json e non già analizzato json. Nei suoi commenti del codice.
  • La chiamata ajax indietro invia stringa per tutto il tempo, no?
  • sì, ma a seconda esattamente come la chiamata ajax è stato fatto, alcuni software sul client può automaticamente analizzarlo. Questo è vero per esempio quando si fa una richiesta ajax tramite jQuery e dire che la risposta è di tipo JSON.
  • questa domanda è tutto il tempo. Che è esattamente l’errore che si ottiene se si passa il .toString() uscita da un già oggetto analizzato in JSON.parse().
  • O se la chiamata torna valore è vuoto. Come : JSON.parse(" ");
  • sì che vorresti farlo anche tu! L’importante è che l’OP per tornare alla domanda e dirci che cosa il console.log() chiamata mostra.
  • console.log(typeof jsonObject) –> oggetto e console.log(jsonObject) –> [object object]
  • Beh, ci si va, jsonObject è già un oggetto. JSON.parse si aspetta un string contenente JSON.
  • Probabilmente duplicati
  • sì , hai ragione, almeno nel mio caso. JSON è stato già analizzato. Ho utilizzato semplicemente il risultato.messaggio invece di var msg = JSON.parse(jsonObject);
  • Non lo stesso errore, ma ho risolto il problema utilizzando $.parseJSON dove JSON.parse non era di lavoro e generando un errore JSON.parse is not a function

InformationsquelleAutor Razib | 2015-05-12

 

8 Replies
  1. 3

    Non penso che si dovrebbe chiamare JSON.parse(jsonObject) se il server invia JSON valido come verrà analizzato automaticamente quando recupera la risposta. Io credo che se Si imposta il Content-type: application/json intestazione verrà analizzato automaticamente.

    Provare a utilizzare jsonObject come se fosse già analizzato, qualcosa come:

    console.log(jsonObject.canApprove);

    Senza chiamare JSON.parse prima.

    • Si noti che, avendo valido JSON e impostazione Content-type: application/json sono due cose diverse. Avendo JSON valido in genere non comporta in automatico l’analisi.
    • Ho notato che se si utilizza dataType:"json" su ajax() di jQuery metodo, non è necessario utilizzare parse() (effettivamente ottenere l’errore detto dall’OP se si fa); ma si deve usare se si dont specificare dataType:"json". Devo studiare perché che. Qualsiasi indizio?
    • Credo che si dovrebbe utilizzare la funzione replace prima di JSON.analizzare esempio : var data = “{\”nome\”:\”alan\”,\”age\”:34}” str = dati.replace(/\\/g, “); // quindi utilizzare JSON.pase funzione var jsonObj =JSON.parse(str);
  2. 3

    Tuo JsonObject sembra è un Oggetto Json. Le ragioni per cui non è possibile analizzare Json da una Stringa:

    • la Stringa è circondata da ” “. e utilizzare \” fuga all’interno di esempio:

      "{\"name\":\"alan\",\"age\":34}"

      quando si tenta di analizzare sopra stringa JSON.parse(), comunque restituire la stringa:{“nome”:”alan”,”età”:34}, e \” è sostituita dal . Ma usare JSON.parse() di nuovo, verrà restituito l’oggetto che si desidera. Quindi, in questo caso,si può fare questo:

      JSON.parse(JSON.parse("{\"name\":\"alan\",\"age\":34}" ))

    • utilizzare invece di . esempio:

      {'name':'alan','age':34}

      quando si tenta di analizzare sopra stringa JSON.parse(), può causare un errore

    • Credo che si dovrebbe utilizzare la funzione replace prima di JSON.analizzare esempio : var data = “{\”nome\”:\”alan\”,\”age\”:34}” str = dati.replace(/\\/g, “); // quindi utilizzare JSON.pase funzione var jsonObj =JSON.parse(str);
  3. 2

    Già un oggetto, non c’è bisogno di analizzarlo. Semplicemente provare

    alert(jsonObject.canApprove)

    nella vostra funzione di risposta.

    Json.analizzare è in attesa di una stringa.

    • “la Sua già Json valido, non c’è bisogno di analizzarlo.” JSON deve sempre essere analizzato. Forse vuoi dire “è un oggetto”?
    • grazie. Corretto.
  4. 1
    var text = '{"canApprove": true,"hasDisplayed": false}';
    
    var parsedJSON = JSON.parse(text);
    
    alert(parsedJSON.canApprove);

    Questo funziona. È possibile utilizzare " invece di ' durante la creazione di una Stringa.

    • Ma ho jsonObject. Come posso convertire text?
    • Ho pensato che volevi analisi JSON in un oggetto. Vuoi andare a fare il contrario ora? Perché?
    • Perché non utilizzare jsonObject.toString() e poi inviare a JSON.analizzare
  5. 1

    Tuo jsonObject sembra già analizzato, è necessario verificare se questo è il caso.

    function(jsonObject){
        var msg = (typeof jsonObject == "object" ? jsonObject : JSON.parse(jsonObject));
    }

    È anche possibile che il vostro call back è vuota, si genera lo stesso errore se si tenta di analizzare una stringa vuota. Quindi prova di nuovo la chiamata di valore.

    function(jsonObject){
        if(jsonObject) {
           var msg = (typeof jsonObject == "object" ? jsonObject : JSON.parse(jsonObject));
        }
    }
    • “Se si invia un valido JSON, non c’è bisogno di analizzarlo” Che non è vero in generale.
  6. 1

    Qui è un esempio di come fare una chiamata ajax e analizzare il risultato:

    var query = {
        sUserIds: JSON.stringify(userIds),
    };
    
    $.ajax({
        type: "POST",
        url: your-url,
        data: JSON.stringify(query),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        success: function (response) {
            var your_object = JSON.parse(response.d);
        }, 
        failure: function (msg) {
            alert(msg);
        },
        error: function (a, b, c) {
    
        }
    });
  7. 0

    Come qualcuno ha detto lassù, questo è in realtà il problema si risolve. Che cosa ho imparato da questo è che può essere come PHP codifica per un oggetto json non è familiare a JavaScript.

    var receivedData = data.toString()
    receivedData = JSON.parse(receivedData)
    console.log(receivedData.canApprove)

    Questo lavoro.

  8. 0

    Ho affrontato un problema simile e ora è risolto. Sto utilizzando ASP.Net MVC per inviare il valore di .file js. Il problema era che stavo tornando a JsonResult dal metodo di Azione, a causa di questo JSON.analizzare stava fallendo .file js. Ho cambiato il tipo di ritorno del metodo di Azione di stringa, ora JSON.analizzare sta lavorando bene.

Lascia un commento