假设给出了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。你们可能明白公司有自己的政策,而不是使用第三方资源"。我该怎么办?我不允许使用它。
答案 0 :(得分:4)
只是一个想法,为什么不首先解析数据然后验证字段:
var serializer = new JavaScriptSerializer();
dynamic obj = serializer.Deserialize(json, typeof(object));
然后你可以验证:obj.Id,obj.Value,obj.isGood
答案 1 :(得分:3)
我将把这个放在JSON知识缺乏尝试的顶端,这样每个人都能看到它:
基本上,对于那些因此而失去理智的人来说,现代正则表达式实现已经比正式的cs正则表达式更远,因此不再仅限于表示常规语言,因为像反向引用和递归这样的事情。因此,我们现在可以使用非常规语言的正则表达式来匹配,我会给你的是非常不直观的。
无论如何,我会把我的尝试留给后代。
这种模式:
{("\w+":(\d+|"\w+"|true|false|null))+}\]
如果我理解正确的话,应该符合您的要求,但是从愤怒的帖子风暴来看,似乎您可能不应该使用正则表达式。
答案 2 :(得分:0)
如果你没有被迫使用RegEx而你只是需要对JSON数据进行语法检查以进行调试,尝试使用在线工具
工作正常(警告:不粘贴敏感数据!)。
示例:如果您粘贴数据
{
"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.");
}