如何testing一个string是否是JSON?

我有一个简单的AJAX调用,服务器将返回一个JSONstring与有用的数据或由PHP函数mysql_error()产生的错误消息string。 我怎样才能testing这个数据是一个JSONstring还是错误信息。

使用一个名为isJSON的函数是很好的,就像你可以使用函数instanceof来testing是否一个数组一样。

这就是我要的:

 if (isJSON(data)){ //do some data stuff }else{ //report the error alert(data); } 

使用JSON.parse

 function isJson(str) { try { JSON.parse(str); } catch (e) { return false; } return true; } 

如果服务器使用JSON响应,那么它将有一个application/json内容types,如果它使用纯文本消息进行响应,那么它应该有一个text/plain内容types。 确保服务器使用正确的内容types进行响应并进行testing。

此代码是JSON.parse(1234)JSON.parse(0)JSON.parse(false)JSON.parse(null)都将返回true。

 function isJson(str) { try { JSON.parse(str); } catch (e) { return false; } return true; } 

所以我重写了这样的代码:

 function isJson(item) { item = typeof item !== "string" ? JSON.stringify(item) : item; try { item = JSON.parse(item); } catch (e) { return false; } if (typeof item === "object" && item !== null) { return true; } return false; } 

testing结果:

是杰森testing结果

我喜欢最好的答案,但如果它是一个空string,它返回true。 所以这是一个修复:

 function isJSON(MyTestStr){ try { var MyJSON = JSON.stringify(MyTestStr); var json = JSON.parse(MyJSON); if(typeof(MyTestStr) == 'string') if(MyTestStr.length == 0) return false; } catch(e){ return false; } return true; } 

当使用jQuery $.ajax() ,如果响应是JSON,则响应将具有responseJSON属性,可以这样检查:

 if (xhr.hasOwnProperty('responseJSON')) {} 

那么…这取决于你收到你的数据的方式。 我认为服务器响应一个JSON格式的string(在PHP中使用json_encode()),例如)。 如果您使用JQuery post并将响应数据设置为JSON格式并且格式错误的JSON,则会产生错误:

 $.ajax({ type: 'POST', url: 'test2.php', data: "data", success: function (response){ //Supposing x is a JSON property... alert(response.x); }, dataType: 'json', //Invalid JSON error: function (){ alert("error!"); } }); 

但是,如果您将types响应用作文本,则需要使用$ .parseJSON。 根据jQuery网站:“传递格式不正确的JSONstring可能会导致exception被抛出。 因此你的代码将是:

 $.ajax({ type: 'POST', url: 'test2.php', data: "data", success: function (response){ try { parsedData = JSON.parse(response); } catch (e) { // is not a valid JSON string } }, dataType: 'text', }); 

有可能你可以做的testing,例如,如果你知道返回的JSON总是被{}包围,那么你可以testing这些字符,或其他一些hacky的方法。 或者您可以使用json.org JS库来尝试parsing它并testing它是否成功。

不过我会提出一个不同的方法。 如果调用成功,您的PHP脚本将返回JSON,但如果不是,则返回其他内容。 为什么不总是返回JSON?

例如

成功电话:

 { "status": "success", "data": [ <your data here> ] } 

错误的电话:

 { "status": "error", "error": "Database not found" } 

这将使得写你的客户端JS更容易 – 所有你需要做的是检查“状态”成员和相应的行为。

 var parsedData; try { parsedData = JSON.parse(data) } catch (e) { // is not a valid JSON string } 

但是,我会build议你的http调用/服务应该总是返回一个格式相同的数据。 所以,如果你有一个错误,比你应该有一个包装这个错误的JSON对象:

 {"error" : { "code" : 123, "message" : "Foo not supported" } } 

也可以使用HTTP状态5xx代码。

我只用两行来执行

 var isValidJSON = true; try { JSON.parse(jsonString) } catch { isValidJSON = false } 

就这样!

但请记住有两个陷阱:
1. JSON.parse(null)返回null
2.任何数字或string都可以用JSON.parse()方法parsing。
JSON.parse("5")返回5
JSON.parse(5)返回5

让我们来玩一下代码:

 // TEST 1 var data = '{ "a": 1 }' // Avoiding 'null' trap! Null is confirmed as JSON. var isValidJSON = data ? true : false try { JSON.parse(data) } catch(e) { isValidJSON = false } console.log("data isValidJSON: ", isValidJSON); console.log("data isJSONArray: ", isValidJSON && JSON.parse(data).length ? true : false); Console outputs: data isValidJSON: true data isJSONArray: false // TEST 2 var data2 = '[{ "b": 2 }]' var isValidJSON = data ? true : false try { JSON.parse(data2) } catch(e) { isValidJSON = false } console.log("data2 isValidJSON: ", isValidJSON); console.log("data2 isJSONArray: ", isValidJSON && JSON.parse(data2).length ? true : false); Console outputs: data2 isValidJSON: true data2 isJSONArray: true // TEST 3 var data3 = '[{ 2 }]' var isValidJSON = data ? true : false try { JSON.parse(data3) } catch(e) { isValidJSON = false } console.log("data3 isValidJSON: ", isValidJSON); console.log("data3 isJSONArray: ", isValidJSON && JSON.parse(data3).length ? true : false); Console outputs: data3 isValidJSON: false data3 isJSONArray: false // TEST 4 var data4 = '2' var isValidJSON = data ? true : false try { JSON.parse(data4) } catch(e) { isValidJSON = false } console.log("data4 isValidJSON: ", isValidJSON); console.log("data4 isJSONArray: ", isValidJSON && JSON.parse(data4).length ? true : false); Console outputs: data4 isValidJSON: true data4 isJSONArray: false // TEST 5 var data5 = '' var isValidJSON = data ? true : false try { JSON.parse(data5) } catch(e) { isValidJSON = false } console.log("data5 isValidJSON: ", isValidJSON); console.log("data5 isJSONArray: ", isValidJSON && JSON.parse(data5).length ? true : false); Console outputs: data5 isValidJSON: false data5 isJSONArray: false // TEST 6 var data6; // undefined var isValidJSON = data ? true : false try { JSON.parse(data6) } catch(e) { isValidJSON = false } console.log("data6 isValidJSON: ", isValidJSON); console.log("data6 isJSONArray: ", isValidJSON && JSON.parse(data6).length ? true : false); Console outputs: data6 isValidJSON: false data6 isJSONArray: false 

您可以尝试解码并捕获exception (native或json2.js ):

 try { newObj = JSON.parse(myJsonString); } catch (e) { console.log('Not JSON'); } 

不过,我会build议让响应总是有效的JSON。 如果您从MySQL查询中得到错误,只需发回带有错误的JSON:

 {"error":"The MySQL error string."} 

接着:

 if (myParsedJSON.error) { console.log('An error occurred: ' + myParsedJSON.error); } 

要build立在第一个答案,而不是复制粘贴代码,您可以导入此开源jsonvalidation器来validationjsonstring。

这是一个用法示例:

 const vaildateJson = require('bit/global/json-validator'); vaildateJson(jsonStr).catch(err => console.log(err)) 

我build议在手稿模式下:

 export function stringify(data: any): string { try { return JSON.stringify(data) } catch (e) { return 'NOT_STRINGIFIABLE!' } } 

除了以前的答案,如果您需要validationJSON格式(如“{}”),则可以使用以下代码:

 const validateJSON = (str) => { try { const json = JSON.parse(str); if (Object.prototype.toString.call(json).slice(8,-1) !== 'Object') { return false; } } catch (e) { return false; } return true; } 

用法示例:

 validateJSON('{}') true validateJSON('[]') false validateJSON('') false validateJSON('2134') false validateJSON('{ "Id": 1, "Name": "Coke" }') true 

所有jsonstring都以'{'或'['开始,并以相应的'}'或']'结尾,所以请检查。

以下是Angular.js如何做的:

 var JSON_START = /^\[|^\{(?!\{)/; var JSON_ENDS = { '[': /]$/, '{': /}$/ }; function isJsonLike(str) { var jsonStart = str.match(JSON_START); return jsonStart && JSON_ENDS[jsonStart[0]].test(str); } 

https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js