2016-11-04 98 views
1

這個問題是關於對於相同的輸入,json.parse的不同行爲?

爲什麼輸出不同

不是我怎樣才能達到合適的輸出。

即使我給JSON.parse()函數提供相同的參數,我無法理解爲什麼以下兩種方案的輸出不相同。

第一個場景

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

調試 Debugging view

第二個場景

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

你在調試器中得到的提示給你帶來了困惑。即使你看到'「{」a「:」asdf「}」'這不是一個格式正確的字符串。如果你用一個字符串開頭,那麼你就結束了。這意味着,這裏的字符串只是「{」,其餘的代碼是瀏覽器不知道該怎麼處理的代碼。正如答案中所說的,你可以使用'將整個字符串封裝爲'''''':'asdf'}''或者將內部字符串轉換爲''{\「a \」:\「asdf \」} 「'。 –

+0

我明白你說的是什麼,但是 - JSON.stringify(obj) - 只返回」{「a」:「asdf」}「,那麼它在這種情況下是如何工作的--JSON.parse (JSON.stringify(obj)) –

+0

它沒有,瀏覽器在控制檯輸出它爲''{「a」:「asdf」}「'但它實際上返回一個字符串,它讀取'{」a「:」 asdf「}'。瀏覽器控制檯決定將它封裝在一個」因爲這是字符串的默認控制檯行爲。所以你會閱讀'「{」a「:」asdf「}」'但它實際上是一個值爲「{」a「:」asdf「}'的類型字符串。 –

回答

1

爲什麼由於輸入爲不同的輸出是不同

第一個場景

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

這裏JSON.parse輸入參數JSON.stringify(obj),這是一個字符串,讀取{"a":"asdf"}

第二場景

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

這裏JSON.parse輸入參數是一個字符串,讀取{,其餘是斷碼。

由於控制檯調試程序決定所有字符串都應該顯示在控制檯上,並以"封裝,但這只是控制檯告訴您此值爲String類型的一種方式。它不檢查你是否有「內部並逃脫它們。

封裝"不是字符串的一部分,只是告訴它是一個字符串的一種方式。

如果console.logging JSON.stringify(obj)讓你"{"a":"asdf"}"嘗試做alert或者document.write。這些不會增加額外的",你會看到JSON.stringify(obj)的值實際上是{"a":"asdf"},而不是"{"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

問題是與報價。

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

應該正常工作。

在Javascript中,我們使用引號(單或雙)來表示字符串。當你想要定義一個包含引號的字符串時,則必須使用不同的引號或escape引號使用反斜槓\字符。

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

也可以正常工作。

你可能會認爲

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

會的工作,但沒有。在JSON中,字符串僅使用雙引號定義。

+0

我明白你在說什麼,但是 - JSON.stringify(obj) - 只返回「{」a「:」asdf「}」「,那麼它在這種情況下是如何工作的。 --JSON.parse(JSON.stringify(OBJ)) –

相關問題