C#,如何使用Regex验证JSON

时间:2013-10-24 20:20:17

标签: c# regex json

假设给出了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
我的问题是"如何使用Regex"验证JSON,而不是"我应该使用Regex"来验证JSON。你们可能明白公司有自己的政策,而不是使用第三方资源"。我该怎么办?我不允许使用它。

4 个答案:

答案 0 :(得分:4)

只是一个想法,为什么不首先解析数据然后验证字段:

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

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

答案 1 :(得分:3)

我将把这个放在JSON知识缺乏尝试的顶端,这样每个人都能看到它:

Regex to validate JSON

基本上,对于那些因此而失去理智的人来说,现代正则表达式实现已经比正式的cs正则表达式更远,因此不再仅限于表示常规语言,因为像反向引用和递归这样的事情。因此,我们现在可以使用非常规语言的正则表达式来匹配,我会给你的是非常不直观的。



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

这种模式:

 {("\w+":(\d+|"\w+"|true|false|null))+}\]
如果我理解正确的话,

应该符合您的要求,但是从愤怒的帖子风暴来看,似乎您可能不应该使用正则表达式。

答案 2 :(得分:0)

如果你没有被迫使用RegEx而你只是需要对JSON数据进行语法检查以进行调试,尝试使用在线工具

http://jsonlint.com/

工作正常(警告:不粘贴敏感数据!)。

示例:如果您粘贴数据

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

你得到了结果:

  

第6行的解析错误:

     

...“isGood”:false}]

     

------------------------ ^期待'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

N.B。 RegEx只能解析regular grammars;对于任何context-free and higher你需要一个堆栈(即一个真正的解析器)。这就是为什么这里显示的解决方案使用RegEx - 正则表达式通常用于解析数字格式,域名格式,电子邮件地址等。为此,他们正在做好工作。对于如上所述的真正解析任务,最好使用真正的解析器。

答案 3 :(得分: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.");                   
            }