1

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

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

我现在要处理 Number、String、Boolean、Null 类型。我可以看到 JSON 的模式是

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

我对正则表达式真的很陌生,所以我不知道......有人可以帮我吗?

编辑
对不起,我没有使用 JSON.NET,我不想使用它。我发现使用 Regex 是验证我的 JSON 字符串的唯一方法。如果有什么建议,我会去的。谢谢

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

4

4 回答 4

4

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

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

然后你可以验证:obj.Id, obj.Value, obj.isGood

于 2013-10-24T20:51:05.260 回答
4

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

正则表达式验证 JSON

基本上,对于所有对此失去理智的人来说,现代正则表达式实现已经比正式的 cs 正则表达式走得更远,因此由于反向引用和递归之类的原因,不再局限于只表示正则语言。因此,我们现在可以使用非正则语言的正则表达式匹配事物,我会给你,这是相当不直观的。



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

这种模式:

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

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

于 2013-10-24T20:24:29.213 回答
0

如果您不是被迫使用 RegEx 并且您只需要对 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


NB RegEx 只能解析正则文法;对于任何无上下文和更高级别的内容,您都需要一个堆栈(即真正的解析器)。这就是为什么这里显示的解决方案使用 RegEx 的原因 - 正则表达式通常用于解析数字格式、域名格式、电子邮件地址等。为此,他们做得很好。对于上述真正的解析任务,最好使用真正的解析器。

于 2015-10-22T11:36:08.043 回答
0

我尝试使用此正则表达式模式使用已接受答案中的注释进行验证,但未成功:

 {("\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.");                   
            }
于 2021-08-11T23:13:20.250 回答