2016-12-18 3 views
1

Ich bin neu in JSON und bekommen diese Ausnahme bei der Verwendung von reviver Parameter in JSON.parse():JSON.parse mit reviver Funktion gibt undefined

TypeError: Cannot read property 'name' of undefined(…). 

Ohne reviver Parameter Code funktioniert gut, aber mit reviver Parameter wirft es die obige Ausnahme. Warum passiert das?

var str = ' { ' + 
 
    ' "name" : "Username", ' + 
 
    ' "fname" : "Fathername" ' 
 
+ ' } '; 
 

 
var jObj = JSON.parse(str, function (a, b) { 
 
    console.log(a + "=>" + b); 
 
}); 
 

 
document.write(
 
    "<h1>" + jObj.name + "</h1>", 
 
    "<h2>" + jObj.fname + "</h2>" 
 
);

+0

Ja, sagt er 'undefined'‘ –

+0

jObj gibt 'undefined' zurück. –

+1

Ja sicher mein Bruder :) –

Antwort

5

Weil Ihre reviver Funktion implizit undefined zurückgibt.

Sie haben etwas zurück, das heißt, die Variable b:

var str = JSON.stringify({ name: 'Username', fname: 'Fathername' }); 
 

 
var jObj = JSON.parse(str, function (a, b) { 
 
    console.log(a, '=>', b); 
 
    return b; 
 
}); 
 

 
document.write('<h1>' + jObj.name + '</h1>', '<h2>' + jObj.fname + '</h2>');

+0

Hoppla !!! Ich habe vergessen, 'Return' Anweisung zu verwenden. Es hat funktioniert, vielen Dank !!! –

0

Sie müssen nur den Wert in JSON.parse zurückzukehren. hier ist ein Beispiel, mit hübschem Code:

var str = '{"name": "Username", "fname": "Fathername"}'; 
 
var parsed = JSON.parse(str, (key, value) => { 
 
      return value; 
 
     }); 
 
document.write(
 
    "<h1>" + parsed.name + "</h1>", 
 
    "<h2>" + parsed.fname + "</h2>" 
 
); 
 

+0

Ja, danke !!! arbeitete –

0

Nach den reviverdescription on MDN:

Wenn der Erneuerer Funktion gibt undefined (oder gibt keinen Wert zurück, zB wenn Ausführung fällt vom Ende der Funktion), die Eigenschaft wird aus dem Objekt gelöscht.

was genau passiert hier. Da in Ihrer Reviver-Funktion keine return-Anweisung vorhanden ist, wird implizit undefined zurückgegeben. Im Folgenden finden Sie eine gleichwertige sehen:

function (a,b) { 
    console.log(a + "=>" + b); 
    return undefined; 
} 

So in diesem Szenario analysiert JSON.parse tatsächlich die Zeichenfolge richtig auf ein Objekt, aber dann setzt seine Eigenschaften durch die reviver-Funktion, die für alle von ihnen undefined zurückgibt. Dies führt dazu, dass undefined zurückgegeben wird.

Wenn Sie wollen es richtig Ihr Objekt machen zu analysieren, können Sie entweder explizit Rückgabewert:

var jObj = JSON.parse(str,function(a,b){ 
    console.log(a + "=>" + b); 
    return b; 
}); 

oder reviver alle zusammen entfernen.

var jObj = JSON.parse(str); 
+0

danke für die Erklärung. Ich hab es geschafft –