检查JSON LIKE字符串是否有效- JS正则表达式

Check if JSON LIKE string is valid - JS regex

本文关键字:JS 正则表达式 有效 是否 JSON LIKE 字符串 检查      更新时间:2023-09-26

我有CLI应用程序,用户提供JSON。我需要检查JSON是否有效。我发现这样的东西可能会很好:

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

但是当我调试我的应用程序时,我注意到有一个小问题,所有"'spaces从命令被剥夺。所以json为:

{
    "key1": "value1",
    "key2": "value2"
} 

被改成:

{key1:value1,key2:value2}

我需要一个正则表达式,它将检查这个剥离的JSON是否有效。

所以结果应该看起来像:

re.test({key1:value1,key2:value2}) // true
re.test({key1:value1}) // true
re.test({key1:value1,}) // false, extra comma
re.test({key1:value1, key2}) // false, missing value of key2
re.test({key1:value1, key2:value2) // false, missing closing }
re.test({key1:value1, key2:value2}}) // false, extra closing }

有人可以帮助我与正则表达式部分?可惜这不是我的强项。

这里有一个正则表达式:

^{(([a-zA-Z0-9]+:[a-zA-Z0-9]+)(,[a-zA-Z0-9]+:[a-zA-Z0-9]+)*)?}$

查看您的示例在这里Regex101.com

正如我在上面的评论中提到的,"剥离"的JSON当然不再是JSON了。您已经确认您不需要担心嵌套的对象或数组,只需一个用花括号括起来的key:value对的简单列表。

因此,下面的正则表达式假设每个键和值都由"word"字符组成,使用等价于[A-Za-z0-9_]的正则表达式'w:

var re = /^'{'w+:'w+(,'w+:'w+)*'}$/;

显然,如果你想改变哪些字符被允许作为键名和值,你可以用[A-Za-z0-9_]替换每个'w,并根据需要添加或删除允许的字符。

编辑:在评论中你提到允许在键名和值中使用.。所以在regex上使用不区分大小写的i标志:

var re = /^'{[A-Z0-9._]+:[A-Z0-9._]+(,[A-Z0-9._]+:[A-Z0-9._]+)*'}$/i;

但是您可能希望允许所有部分之间有可选的空白,所以我建议在所有令牌之间添加's*:

var re = /^'s*'{'s*[A-Z0-9._]+'s*:'s*[A-Z0-9._]+'s*(,'s*[A-Z0-9._]+'s*:'s*[A-Z0-9._]+'s*)*'}'s*$/i;
console.log( re.test('{key1:value1,key2:value2}') )   // true
console.log( re.test('{key1:value1}') )               // true
console.log( re.test(' { key1 : value1 , key2 : value2 ,  k3  :   v3  } ') ) // true
console.log( re.test(' { k.j.m : v.a2 , k2.a.b : v.32 ,  k3  :   v3  } ') ) // true
console.log( re.test('{key1:value1,}') )              // false, extra comma
console.log( re.test('{key1:value1, key2}') )         // false, missing value of key2
console.log( re.test('{key1:value1, key2:value2') )   // false, missing closing }
console.log( re.test('{key1:value1, key2:value2}}') ) // false, extra closing }

(请注意,我在名称中编辑的允许.的位将允许多个.字符在一行中,但我真的不想继续回来更新我的答案,因为添加了更多的要求,在原始帖子中没有提到。如果你想保持它严格一个.在一行中,没有前导或尾随点,那么只需应用相同的原则,上面的regex用于使逗号工作