在 JavaScript 中檢查字串是否是有效的 JSON 字串
本文將介紹如何在不使用 JavaScript 中的 try...catch
的情況下檢查給定字串是否是有效的 JSON 或 JavaScript Object Notation 字串。讓我們從 JSON 字串的定義開始,以及它如何幫助我們簡化工作流程。
JSON 是一種獨立於語言的文字格式,用於結構化資料,與 XML 非常相似;它可以由字串、整數、浮點數等、布林值、陣列或用大括號括起來的 Java 物件(鍵值對)組成
JSON 和 Javascript 物件之間的區別
JavaScript 中的物件是這樣的:
object = {name:"Haseeb", age:31, city:"New York",male:true}
當該物件以 JSON 格式儲存時,它看起來像這樣:
{"name":" Haseeb ", "age":31, "city":"New York", "male":true}
當我們從文字檔案中檢索物件時,它會被轉換為 JSON 字串格式:
{"name":" Haseeb ", "age":31, "city":"New York", "male":true}
我們可以看到 JSON 格式如何是人類可讀的並且更容易被語言操作。
除此之外,它還有很多優點; JSON 除了易於讀寫之外,還可以與所有語言整合,並且由於其詳細的結構,現在可以方便地使用解析。
JSON 通常用於應用程式程式設計介面 (API),因為它主要用於將資料傳輸到伺服器或從伺服器傳輸到 Web 或移動應用程式,反之亦然。
通過使用 JSON 的 parse 函式,我們現在可以從 JSON 字串建立物件,這是一個如何完成的示例:
string = '{"name":"John", "age":31, "city":"New York", "male":true}';
object = JSON.parse(string);
console.log(object);
輸出:
{
name: 'John',
age: 31,
city: 'New York',
male: true
}
正如預期的那樣,解析函式將所有內容縮減為物件的鍵和值(JSON 物件),這就是 JSON 字串現在已成為在系統之間傳輸資料的約定的原因。
在 JavaScript 中檢查 JSON 字串的有效性
try...catch
用於處理可能在給定 JSON 字串中彈出的任何潛在錯誤,而不會停止程式的執行。字串可能有錯誤的語法、缺少引數,或者可能是錯誤的拆分引數。
下面是我們如何使用 try...catch
檢查 JSON 字串的有效性:
try {
object = JSON.parse(json);
} catch (error) {
is_json = false;
console.log("Invalid JSON string");
}
讓我們嘗試給我們的程式碼這個字串:
json = '{"name":"John","city""New York"}';
輸出:
Invalid JSON string
正如我們所看到的,我們的 try...catch
並沒有告訴我們字串有什麼問題。它只是告訴我們存在一些問題。
為了深入瞭解 JSON 字串中的問題,我們可以使用自定義函式來檢測(如果不是全部)在不使用 try...catch
的情況下在字串中彈出的一些錯誤。
isJSON = function(json) {
//Nested Count function only to be used for counting colons and commas
countCharacter = function(string,character) {
count = 0;
for (var i = 0; i < string.length; i++) {
if (string.charAt(i) == character) { //counting : or ,
count ++;
}
}
return count;
}
json = json.trim(); // remove whitespace, start and end spaces
//check starting and ending brackets
if (json.charAt(0) != '{' || json.charAt(json.length-1) != '}') {
console.log("Brackets {} are not balanced")
return false
}
//else this line will check whether commas(,) are one less than colon(:)
else if ( !(countCharacter(json,':')-1 == countCharacter(json, ',')) ){
console.log("comma or colon are not balanced");
return false;
} else {
json = json.substring(1, json.length-1); //remove first and last brackets
json = json.split(','); //split string into array, and on each index there is a key-value pair
//this line iterate the array of key-value pair and check whether key-value string has colon in between
for (var i = 0; i < json.length; i++) {
pairs = json[i];
if (pairs.indexOf(':') == -1) { //if colon not exist in b/w
console.log("No colon b/w key and value");
return false;
}
}
}
return true;
};
讓我們使用這兩個 JSON 字串並找出它們的錯誤。
json = ' {"name":"John","city""New York"} ';
json2 = ' {"name":"John","city":"New York" ';
輸出:
comma or colon are not balanced
false
Brackets {} are not balanced
false
這段程式碼很弱,因為它對於一些錯誤的情況是正確的,所以我們找到了一種混合方法來合併上層函式和 try...catch
程式碼,以通過一些除錯獲得絕對答案。
isJSON = function(json) {
is_json = true; //true at first
//Try-catch and JSON.parse function is used here.
try {
object = JSON.parse(json);
} catch (error) {
is_json = false;
console.log("might be a problem in key or value's data type");
}
if (!is_json) {
countCharacter = function(string,character) {
count = 0;
for (var i = 0; i < string.length; i++) {
if (string.charAt(i) == character) { //counting : or ,
count ++;
}
}
return count;
}
json = json.trim(); // remove whitespace, start and end spaces
if (json.charAt(0) != '{' || json.charAt(json.length-1) != '}') {
console.log("Brackets {} are not balanced")
}
else if ( !(countCharacter(json,':')-1 == countCharacter(json, ',')) ){
console.log("comma or colon are not balanced");
} else {
json = json.substring(1, json.length-1); //remove first and last brackets
json = json.split(',');
for (var i = 0; i < json.length; i++) {
pairs = json[i];
if (pairs.indexOf(':') == -1) { //if colon not exist in b/w
console.log("No colon b/w key and value");
}
}
}
}
return is_json;
};
json = ' {"name":"John", "birth":"1986-12-14", "city":5a0} ';
輸出:
might be a problem in key or value's data type
false
這個函式被賦予了與前一個函式相同的除錯級別,但這次的答案將是絕對的。