[英]JSON.parse on a number as a string doesn't throw error
我相信這是正確區分無效的JSON對象為字符串和有效的字符串的一種方法
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.parse的MDN文檔時 ,我發現了reviver方法。 我寫了一個似乎適用於所有情況的函數。 此功能實際上是正確的方法嗎?
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對象作為字符串 。 關於此編輯問題。
JSON文本可以是任何JSON數據類型。
1234
…是由數字組成的有效JSON文本。 (將1234
作為數字傳遞給JSON.parse
因為它已通過JavaScript的常規類型轉換規則轉換為字符串)。
"Is life a valid JSON?"
…是由字符串組成的有效JSON文本。
Is life a valid JSON?
…不是有效的JSON文本。 它只是一堆字符,與任何JSON數據類型的語法都不匹配。
所以不行。 您的第二個功能不正確。 它聲稱1234
不是有效的JSON。
我認為isValidJsonString(1234)
返回true
情況只是Javascript是其通常的急切自我,希望在第一時間將事物轉換為字符串。 如果在函數中添加一個檢查,檢查該參數實際上是一個字符串,則一切都很好:
function isValidJsonString(s) {
if (typeof s !== 'string') {
return false;
}
try {
JSON.parse(s);
return true;
} catch (e) {
return false;
}
}
其他人已經按預期工作。
該代碼段實際上將數字和數字識別為有效的JSON字符串。 誰能闡明為什么/如何發生?
之所以發生這種情況,是因為數字作為字符串是有效的JSON字符串。
[編輯]我可能錯誤地暗示我要區分有效的JSON字符串。 我的意思是,將有效的JSON對象作為字符串。 關於此編輯問題。
您當前的方法也不會這樣做,它僅排除數字。
JSON值可以是七種不同的東西:object(在{}
),數組(在[]
),字符串(在""
),number, null
, false
或true
。 其中,僅排除數字。
如果使用typeof v !== "object"
,則僅接受對象,數組和null
。 也許這就是您想要的,也許不是。
如果只需要JSON對象,只需檢查JSON字符串中的第一個非空白字符是否為{
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.