2016-10-10 28 views
-1

我認爲,這是從一個有效的JSON.parse上一個數字作爲一個字符串不會引發錯誤

function isValidJson(s) { 
 
    try { 
 
    JSON.parse(s); 
 
    return true; 
 
    } catch (e) { 
 
    return false; 
 
    } 
 
} 
 

 
console.log(isValidJson(1234)); // true 
 
console.log(isValidJson('1234')); // true 
 
console.log(isValidJson('Is life a valid JSON?')); // false :(
 
console.log(isValidJson('{"a" : { "b": [1, 2, 3] }}')); // true
正確區分無效 JSON對象作爲字符串的途徑之一

這是我看到的最常見的答案,關於實現區別。我似乎不太明白這裏發生了什麼。這段代碼實際上將數字和數字識別爲字符串作爲有效的JSON對象。任何人都可以點亮爲什麼/如何發生這種情況?

此外,在閱讀MDN docs for JSON.parse,我發現齊磊方法。我寫了一個似乎適用於所有場景的函數。這個函數實際上是否正確?

function isValidJson(s) { 
 
    try { 
 
    JSON.parse(s, function(k, v) { 
 
     if (k === "" && typeof v === "number") { 
 
     throw "Invalid JSON"; 
 
     } 
 
     return v; 
 
    }); 
 
    return true; 
 
    } catch (e) { 
 
    return false; 
 
    } 
 
} 
 

 
console.log(isValidJson(1234)); // false 
 
console.log(isValidJson('1234')); // false 
 
console.log(isValidJson('Is life a valid JSON?')); // false :(
 
console.log(isValidJson('{"a" : { "b": [1, 2, 3] }}')); // true

[編輯]我可能會錯誤地暗示,我在尋找區分有效的JSON字符串。我的意思是,有效的作爲字符串的JSON對象。就此編輯這個問題。

+0

你認爲數組是對象嗎? Javascript不會,但JSON不會。那麼null呢? – RemcoGerlich

+0

是的。我需要'[]'以及'{}'才能被視爲有效。 null不應該被認爲是有效的,我想我的解決方案不認爲是空的。我可以改變這一點。我更傾向於理解JSON.parse在傳入數字或數字字符串時不會拋出異常。 –

+0

你的第一個函數不會拋出異常,因爲數字字符串很好JSON,你的第二個函數事實上會在你的if中拋出「無效的JSON」異常,因爲那個返回'1234'的假。所以我不明白你的意見。 – RemcoGerlich

回答

2

甲JSON文本可以是任何JSON數據類型。

1234 

...是由數字組成的有效JSON文本。 (將1234作爲數字傳遞給JSON.parse,因爲它通過JavaScript的正常類型轉換規則轉換爲字符串)。

"Is life a valid JSON?" 

...是由String組成的有效JSON文本。

Is life a valid JSON? 

...不是有效的JSON文本。它只是一堆與任何JSON數據類型的語法都不匹配的字符。

所以沒有。你的第二個功能不對。它聲稱1234不是有效的JSON。

1

我認爲isValidJsonString(1234)返回true的情況正好是它的慣用手段,即在第一次把事情轉化爲字符串的時候,它就是它的慣用手段。如果添加的支票的說法實際上是一個字符串函數,一切都很好:

function isValidJsonString(s) { 
    if (typeof s !== 'string') { 
    return false; 
    } 
    try { 
    JSON.parse(s); 
    return true; 
    } catch (e) { 
    return false; 
    } 
} 

其他人已經因爲他們應該工作。

這段代碼實際上將數字和數字識別爲字符串作爲有效的JSON字符串。任何人都可以點亮爲什麼/如何發生這種情況?

它發生,因爲數字作爲字符串是有效的JSON字符串。

[編輯]我可能錯誤地暗示我正在尋找區分有效的JSON字符串。我的意思是,有效的JSON對象作爲字符串。就此編輯這個問題。

您目前的方法也不會這樣做,它只會排除數字。

JSON值可以是七種不同的東西:對象(在{}),陣列(在[]),字符串(在""),數,nullfalsetrue。其中,您只排除數字。

如果使用typeof v !== "object",那麼只接受對象,數組和null。也許這就是你想要的,也許不是。

如果您只想要JSON對象,請檢查JSON字符串中的第一個非空白字符是否爲{

相關問題