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 吗"。你们可能明白公司有自己的政策"不使用第三方资源"。伙计们,我该怎么办?我只是不被允许使用它。
我将把它放在我缺乏 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.");
}