C#,如何使用正则表达式验证 JSON

本文关键字:验证 JSON 正则表达式 何使用 | 更新日期: 2023-09-27 18:36:43

假设给出了JSON字符串,我想使用C#进行验证。我们都知道JSON字符串有以下格式

string jsonStr = {"Id":123,"Value":"asdf","Time":"adf","isGood":false}];

我现在想处理数字、字符串、布尔值、空值类型。我可以看到 JSON 的模式是

{ + " + String + " + : + (Number)|(Boolean)|(" + String + ")|(Null) + , + ... + } + ]
// ... means one or more

我真的很陌生于正则表达式,所以我不知道...谁能帮我?

编辑
抱歉,我没有使用 JSON.NET,也不想使用它。我发现使用正则表达式是验证我的 JSON 字符串的唯一方法。如果有任何建议,我会去的。谢谢

编辑2
我的问题是"如何使用正则表达式验证 JSON",而不是"我应该使用正则表达式验证 JSON 吗"。你们可能明白公司有自己的政策"不使用第三方资源"。伙计们,我该怎么办?我只是不被允许使用它。

C#,如何使用正则表达式验证 JSON

我将把它放在我缺乏 JSON 知识的尝试的顶部,以便每个人都看到它:

用于验证 JSON 的正则表达式

基本上,对于每个对此失去理智的人来说,现代正则表达式实现已经比正式的 cs 正则表达式走得更远,因此不再局限于仅表示常规语言,因为反向引用和递归之类的东西。因此,我们现在可以将非常规语言的正则表达式进行匹配,我会给你,这是相当不直观的。



无论如何,我都会把我的尝试留给后代。

此模式:

 {("'w+":('d+|"'w+"|true|false|null))+}']

如果我理解正确,应该符合您的要求,但是从愤怒帖子的风暴中,您似乎不应该使用正则表达式。

只是一个想法,为什么不先反序列化数据,然后再验证字段:

var serializer = new JavaScriptSerializer();
dynamic obj = serializer.Deserialize(json, typeof(object));

然后,您可以验证:obj。同上,对象。值,obj.isGood

如果您没有被迫使用正则表达式,并且只需要对 JSON 数据进行语法检查以进行调试,请尝试使用在线工具

http://jsonlint.com/

这做得很好(注意:不要粘贴敏感数据!

示例:如果粘贴数据

{
    "Id": 123,
    "Value": "asdf",
    "Time": "adf",
    "isGood": false
}]

你得到的结果是:

第 6 行的解析错误:

。 "是好的":假}]

------------------------^ 期待"EOF"

如果必须验证敏感数据,可以查看源代码,该源代码可在 GitHub 上找到:

https://github.com/arc90/jsonlintdotcom。

还有一个纯JS版本可用:https://github.com/zaach/jsonlint。

<小时 />

如果您打算执行基于架构的验证,例如确定 JSON 数据是否包含正确的数据类型,请查看此处:

https://stackoverflow.com/questions/19544183/validate-json-against-json-schema-c-sharp

<小时 />注

:注:正则表达式只能解析常规语法;对于任何上下文无关和更高版本,您需要一个堆栈(即真正的解析器)。这就是为什么这里显示的解决方案不使用正则表达式 - 正则表达式通常用于解析数字格式、域名格式、电子邮件地址等。为此,他们正在做好工作。对于上面提到的实际解析任务,最好使用真正的解析器。

我试图使用接受答案中注释的内容进行验证,但没有成功使用此正则表达式模式:

 {("'w+":('d+|"'w+"|true|false|null))+}']

{[^}]+}尝试过这种模式,现在我有一个很好的验证:

            WebClient client = new WebClient();
            string myJSON = client.DownloadString(jsonFile);
         
            //var regex = @"{('w+:('d+|'w + |true|false|null))+}']";
            var regex = @"{[^}]+}";
            var match = Regex.Match(myJSON, regex, RegexOptions.IgnoreCase);
            if (!match.Success)
            {
                Debug.WriteLine("* JSON NOT VALID.");                   
            }
            else
            {
                Debug.WriteLine("* JSON VALID.");                   
            }