isJsonString('{ "Id": 1, "Name": "Coke" }')
应该是true
。isJsonString('foo')
isJsonString('<div>foo</div>')
应该是false
。
我正在寻找一种不使用try
/catch
的解决方案,因为我的调试器设置为"在所有错误上中断",这会导致它在无效的JSON字符串上中断。
isJsonString('{ "Id": 1, "Name": "Coke" }')
应该是true
。isJsonString('foo')
isJsonString('<div>foo</div>')
应该是false
。
我正在寻找一种不使用try
/catch
的解决方案,因为我的调试器设置为"在所有错误上中断",这会导致它在无效的JSON字符串上中断。
使用类似于JSON.parse
的 JSON 解析器:
function isJsonString(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
JSON.parse("false")
的计算结果也是false。 - Gumbo我知道我回答这个问题已经晚了3年,但我还是想发表一下意见。
虽然Gumbo的解决方案很好,但它无法处理一些情况,比如JSON.parse({something that isn't JSON})
没有引发异常的情况。
我更喜欢同时返回解析后的JSON,这样调用代码就不必再调用JSON.parse(jsonString)
一次。
这对我的需求似乎很有效:
/**
* If you don't care about primitives and only objects then this function
* is for you, otherwise look elsewhere.
* This function will return `false` for any valid json primitive.
* EG, 'true' -> false
* '123' -> false
* 'null' -> false
* '"I'm a string"' -> false
*/
function tryParseJSONObject (jsonString){
try {
var o = JSON.parse(jsonString);
// Handle non-exception-throwing cases:
// Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
// but... JSON.parse(null) returns null, and typeof null === "object",
// so we must check for that, too. Thankfully, null is falsey, so this suffices:
if (o && typeof o === "object") {
return o;
}
}
catch (e) { }
return false;
};
o && o !== null
是多余的。 - Aleksei Matiushkinundefined
而不是 false
,因为 false
是一个有效的 JSON 字符串,并且无法区分 tryParseJSON("false")
和 tryParseJSON("garbage")
。 - sparebytestry/catch
的。JSON
字符串,它适用于大多数情况,但不是所有情况。
请查看位于https://github.com/douglascrockford/JSON-js/blob/master/json2.js第450行附近。
有一个正则表达式用于检查有效的 JSON,像这样:
if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
//the json is ok
}else{
//the json is not ok
}
编辑:json2.js的新版本进行了更高级的解析,但仍基于正则表达式替换(来自@Mrchief的评论)。
JSON.parse
的速度更快,大约只需 0.2 毫秒就能完成任务,而这个 if 比较需要大约 0.9 毫秒。 - Machado// vanillaJS
function isJSON(str) {
try {
return (JSON.parse(str) && !!str);
} catch (e) {
return false;
}
}
用法: isJSON({})
将返回false
,isJSON('{}')
将返回true
。
检查某个东西是否为Array
或Object
(已解析的JSON):
// vanillaJS
function isAO(val) {
return val instanceof Array || val instanceof Object;
}
// ES2015
var isAO = (val) => val instanceof Array || val instanceof Object;
用法: isAO({})
将返回true
,isAO('{}')
将返回false
。
null
可以通过此验证,因此需要小心。 - Farzad Yousefzadehreturn !!(JSON.parse(str) && str);
应该阻止空值。我会用这段代码更新答案。 - Machadoparse()
测试,导致WTF。 - not2qubit这是我的工作代码:
function IsJsonString(str) {
try {
var json = JSON.parse(str);
return (typeof json === 'object');
} catch (e) {
return false;
}
}
typeof str === 'string'
来修复。 - gramchanull
表示一个 object
的空值,所以从我的角度来看这看起来不错... 它可能不适用于您的特定情况,但它就是它。 - HellBaby我使用了一种非常简单的方法来检查字符串是否为有效的JSON。
function testJSON(text){
if (typeof text!=="string"){
return false;
}
try{
var json = JSON.parse(text);
return (typeof json === 'object');
}
catch (error){
return false;
}
}
有效JSON字符串的结果:
var input='["foo","bar",{"foo":"bar"}]';
testJSON(input); // returns true;
一个简单字符串的结果;
var input='This is not a JSON string.';
testJSON(input); // returns false;
使用对象的结果:
var input={};
testJSON(input); // returns false;
空输入的结果:
var input=null;
testJSON(input); // returns false;
最后一个返回false,因为null类型的变量是object。
这总是有效的。:)
null
时会返回false。但是"false"输入是一个有效的JSON字符串。它将被解析为boolean (false)
。现在我修改代码使其更准确。 - kukko{ a: 1, a: 2 }
为有效。有什么想法可以使其验证为假吗? - Alfonso TiendaJSONTryParse(input: any) {
try {
//check if the string exists
if (input) {
var o = JSON.parse(input);
//validate the result too
if (o && o.constructor === Object) {
return o;
}
}
}
catch (e: any) {
}
return false;
};
我来晚了。这是我最终采取的做法。 使用快速正则表达式预检可大幅提高性能。
if(/^\s*(\{|\[)/.test(str)){
try{
JSON.parse(str)
// do something here, or return obj/true
}catch(e){
// do nothing or return false
}
}
正则表达式将检查字符串是否以[
或{
开头。这将消除大多数错误情况(但不是全部)。以下是一个快速的性能测试https://jsbench.me/awl6fgn8jb/1
最坏情况下,这可能比直接使用try
慢10-15%,最坏情况是所有字符串都是有效的JSON字符串。
最好情况下,这比纯try
快99%,最好情况是所有字符串都是非有效的JSON。
这仅寻找解析为对象或数组的字符串。请注意,像“true”这样的字符串化js-primitive值是有效的JSON字符串,出于简单起见,我故意忽略了它们。对于全面的预检,请根据您的用例添加其他检查。
isValidJsonString - 检查有效的JSON字符串
JSON数据类型 - 字符串、数字、对象(JSON对象)、数组、布尔值、null (https://www.json.org/json-en.html)
Javascript中假值 - false, 0, -0, 0n, "", null, undefined, NaN - (https://developer.mozilla.org/en-US/docs/Glossary/Falsy)
JSON.parse
对于数字、布尔值、null和有效的JSON字符串,JSON.parse能够正常工作且不会引发任何错误,请参考下面的示例:
在解析undefined、对象、数组等时会报错,请参考下面的示例:
function isValidJsonString(jsonString){
if(!(jsonString && typeof jsonString === "string")){
return false;
}
try{
JSON.parse(jsonString);
return true;
}catch(error){
return false;
}
}
function isJsonString(json){try{var o=JSON.parse(json);if(o&&typeof o==="object"){return o}}catch(e){}return false}
...,如果json
无效,则返回解析后的对象,否则返回False
。 - ashleedawg