2016-11-04 4 views
1

Diese Frage ist überUnterschiedliches Verhalten von json.parse für die gleiche Eingabe?

warum die Ausgänge unterschiedlich sind

nicht, wie ich die richtige Ausgabe erreichen kann.

Ich kann nicht verstehen, warum die Ausgabe der folgenden zwei Szenarien nicht identisch ist, auch wenn ich der JSON.parse() - Funktion das gleiche Argument gebe.

erstes Szenario

obj = {a:"asdf"}; 
var newObj = JSON.parse(JSON.stringify(obj));  //newObj = {a:"asdf"} 

Debuggen Debugging view

zweites Szenario

var newObj = JSON.parse("{"a":"asdf"}");  //this gives an error 
+0

Der Hinweis, den Sie in Ihrem Debugger bekommen, hat Sie verwirrt. Obwohl dort "{" a ":" asdf "}" 'zu sehen ist, ist dies keine korrekt formatierte Zeichenkette. Wenn Sie eine Zeichenfolge mit "dann beenden Sie es mit" beginnen. Das bedeutet, hier ist die Zeichenfolge nur "{" und der Rest ist Code gebrochen, der Browser weiß nicht, was zu tun ist. Wie in den Antworten gesagt, können Sie entweder 'den gesamten String als '{' a": "asdf"} ''kapseln oder Sie entkommen dem inneren" as '" {\ "a \": \ "asdf \"} "'. –

+0

Ich verstehe, was Sie sagen wollen, aber - JSON.stringify (Obj) - gibt nur" {"a": "asdf"} "zurück, wie funktioniert es in diesem Fall. --JSON.parse (JSON.stringify (obj)) –

+0

Das tut es nicht.Der Browser gibt es in der Konsole als '{" a ":" asdf "}" aus, aber es gibt tatsächlich eine Zeichenkette zurück, die '{" a ":" asdf "}'. Die Browser-Konsole entscheidet sich dafür, dies in ein "" einzufügen, da dies das Standardverhalten der Konsole mit Strings ist. Sie werden also "{" a ":" asdf "}" 'lesen, aber es handelt sich tatsächlich um einen Typstring mit dem Wert' {"a": "asdf"} '. –

Antwort

1

warum die Ausgänge sind unterschiedlich

da die Eingänge unterschiedlich sind.

erstes Szenario

obj = {a:"asdf"}; 
var newObj = JSON.parse(JSON.stringify(obj)); 

Hier wird der Eingangsparameter von JSON.parse ist JSON.stringify(obj) und dies ist eine Zeichenfolge, die {"a":"asdf"} liest.

zweites Szenario

var newObj = JSON.parse("{"a":"asdf"}"); 

Hier wird der Eingangsparameter von JSON.parse ist eine Zeichenfolge, die { liest und der Rest ist gebrochen Code.

Verwirrung entsteht, weil die Konsole Debugger entscheidet sollten alle Saiten auf der mit einem " verkapselt Konsole angezeigt werden, aber dies ist nur eine Möglichkeit für die Konsole, Ihnen zu sagen, dass dieser Wert vom Typ String ist. Es prüft nicht, ob du "drinnen bist und entkommst ihnen.

Die Kapselung " sind nicht Teil der Zeichenfolge, nur eine Möglichkeit zu sagen, es ist eine Zeichenfolge.

Wenn console.logging JSON.stringify (obj) bekommt Sie "{"a":"asdf"}" versuchen Sie stattdessen Alert, oder document.write. Diese fügen nicht extra " hinzu und Sie werden sehen, dass der Wert von JSON.stringify (obj) tatsächlich {"a":"asdf"} ist, nicht "{"a":"asdf"}".

<html><head></head><body> 
<script> 
function JSONparse(string) { 
    document.write(string); 
    alert(string); 
    console.log(string); 
    return JSON.parse(string); 
} 
var obj = {a:"asdf"}; 
result = JSONparse(JSON.stringify(obj)); 
</script> 
</body></html> 
3

Das Problem ist, mit Anführungszeichen.

var newObj = JSON.parse('{"a":"asdf"}'); 

sollte ordnungsgemäß funktionieren.

In Javascript verwenden wir Anführungszeichen (einfach oder doppelt), um einen String darzustellen. Wenn Sie einen String definieren möchten, der Anführungszeichen enthält, müssen Sie verschiedene Anführungszeichen verwenden, oder escape die Anführungszeichen, die den umgekehrten Schrägstrich \ Zeichen verwenden.

var newObj = JSON.parse("{\"a\":\"asdf\"}"); 

funktioniert auch gut.

Man könnte denken, dass

var newObj = JSON.parse("{'a':'asdf'}"); 

funktionieren würde, aber nein. In JSON werden Zeichenfolgen nur mit doppelten Anführungszeichen definiert.

+0

Ich verstehe, was Sie sagen wollen, aber - JSON.stringify (obj) - gibt nur "{" a ":" asdf "}" zurück, wie funktioniert es in diesem Fall. --JSON.parse (JSON.Stringify (Obj)) –

Verwandte Themen