json.net有关键方法吗?


139

如果我的回复中包含键“错误”,我需要处理错误并显示警告框。

json.net中是否存在“ haskey”方法?喜欢:

var x= JObject.Parse(string_my);
if(x.HasKey["error_msg"])
    MessageBox.Show("Error!")

1
在这里参考我的回答。

我在这里回答的问题有类似的问题:stackoverflow.com/a/47204235/1037314

1
这个问题有两种变体:一种变体是JSON字典是平坦的(无子代),另一种是键在子代层次结构中的某处。在撰写本文时,ns.json仍然没有方便的方法来方便地测试密钥。
ljgww

Answers:


239

只需使用x["error_msg"]。如果该属性不存在,则返回null


37
如果财产的价值是null多少?
Andreas Furster,2015年

67
@AndreasFurster然后,它会返回一个JValue,其Valuenull,不只是null
svick

1
如果null可以使用x["error_msg"] is Object该属性,则可以检查该属性是否在JSON对象中定义
stonito

2
@ user3199329这只是一种令人困惑的编写方式x["error_msg"] != null,所以不,它不会检查该属性是否存在并且值是否为null
svick '16

9
@ WilliamT.Mallard在C#6中,可以通过使用空条件索引运算符来简化此过程myJObject["level1property"]?["level2property"]
svick

98

JObject实现IDictionary<string, JToken>,因此您可以使用:

IDictionary<string, JToken> dictionary = x;
if (dictionary.ContainsKey("error_msg"))

...或者您可以使用TryGetValue。它使用显式接口实现来实现这两种方法,因此您必须先转换为IDictionary<string, JToken>while 才能使用它们。


我认为这将是缓慢的然后被接受的答案,但谢谢。
2011年

2
@wsevendays,这里的速度对您而言是否重要,或者只是进行微优化(并基于猜测)?您应该使用发现的更具可读性的内容。
svick

我的WP7手机的1GHz处理器速度不是很好,我需要关心速度。
2011年

1
@wsevendays:为什么它会比接受的答案慢(或快)?
乔恩·斯基特

24
@wsevenday:不,它不会创建字典。JObject 已经实施 IDictionary<string, JToken>。这只是参考作业。不,接受的答案不是检查键是否在数组中 ……它仍在使用普通索引器。仅仅因为看起来像数组访问并不意味着它就是数组访问。(首先不能通过字符串访问数组。)
Jon Skeet

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.