簡體   English   中英

JSON.parse在數字上作為字符串不會引發錯誤

[英]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.parseMDN文檔時 ,我發現了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, nullfalsetrue 其中,僅排除數字。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM