如何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