前言
針對 “js判斷字符串是否為JSON格式” 這個問題,在網上查了許多資料,都沒找到自己想要的答案。
但是看到這個帖子《js判斷字符串是否為JSON格式》后,突然靈光一閃,想到一種很簡單的解決方案。
如果你對這個方法有異議,歡迎留言探討。
解決方案
V2.0版 --- 感謝@年少輕狂識 @marihees 的提醒,已經對代碼進行了更新
function isJSON(str) {
if (typeof str == 'string') {
try {
var obj=JSON.parse(str);
if(typeof obj == 'object' && obj ){
return true;
}else{
return false;
}
} catch(e) {
console.log('error:'+str+'!!!'+e);
return false;
}
}
console.log('It is not a string!')
}
v1.0 不嚴謹,已廢棄。
function isJSON(str) { if (typeof str == 'string') { try { var obj=JSON.parse(str); if(str.indexOf('{')>-1){ return true; }else{ return false; } } catch(e) { console.log(e); return false; } } return false; }
分析
就像之前的帖子所說,只是單純的用JSON.parse(str)不能完全檢驗一個字符串是JSON
格式的字符串,有許多例外:
JSON.parse('123'); // 123
JSON.parse('{}'); // {}
JSON.parse('true'); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null'); // null
我們知道,JS中的數據類型分為:字符串、數字、布爾、數組、對象、Null、Undefined。
那我們就針對這幾種類型的字符串進行測試。
function isJSON_test(str) { if (typeof str == 'string') { try { var obj=JSON.parse(str); console.log('轉換成功:'+obj); return true; } catch(e) { console.log('error:'+str+'!!!'+e); return false; } } console.log('It is not a string!') }
isJSON_test('123'); //number
isJSON_test('aaaa'); //string
isJSON_test('"aaa"');
isJSON_test('true'); //布爾
isJSON_test('["1","2"]'); //數組
isJSON_test('{name:"123"}'); //對象
isJSON_test('{}'); //空對象
isJSON_test('null'); //null
isJSON_test('Undefined'); //Undefined
isJSON_test('{"name":"123"}'); //json
isJSON_test('{"name":"123",}'); //不規范的json
---- v2.0新增測試 -----
isJSON_test('["1{211323}","2"]'); //數組 :含有{字符
isJSON_test('[{},"2"]'); //數組 :子項包含對象
isJSON_test('[[{},{"2":"3"}],"2"]'); //多維數組
測試結果如下圖:
V1.0
從以上測試結果,以及JSON的定義 。可以得到一個規律:
如果JSON.parse能夠轉換成功;並且字符串中包含 { 時,那么這個字符串就是JSON格式的字符串。
V2.0
以上測試結果,能夠轉換成功的有:數字、字符串、布爾、數組、空對象、null、json。
其中正確的JSON格式有: 數組、空對象、json
所以得出以下結論:
如果JSON.parse能夠轉換成功;並且轉換后的類型為object 且不等於 null,那么這個字符串就是JSON格式的字符串。
如果大家對這個方法有異議,歡迎在下方留言,感謝。