json.net 有关键方法吗?

Posted

技术标签:

【中文标题】json.net 有关键方法吗?【英文标题】:json.net has key method? 【发布时间】:2011-11-05 05:24:45 【问题描述】:

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

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

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

【问题讨论】:

请参考我的回答here。 我在这里回答了一个类似的问题:***.com/a/47204235/1037314 这个问题有两种变体:一种变体是 JSON 字典是扁平的(没有子级),另一种是键位于子级层次结构中的某个位置。在撰写本文时,ns.json 仍然没有方便的方法可以轻松访问测试密钥。 【参考方案1】:

JObject 实现了IDictionary<string, JToken>,所以你可以使用:

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

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

【讨论】:

我认为这将是慢慢接受的答案,但谢谢。 @wsevendays,这里的速度对你很重要还是只是微优化(并基于猜测)?您应该使用您认为更具可读性的内容。 我的 WP7 手机 1GHz 处理器的速度不是很好,我需要关心速度。 @wsevendays:为什么它会比接受的答案慢(或快)? @wsevenday:不,它不会创建字典。 JObject 已经实现 IDictionary&lt;string, JToken&gt;。这只是一个参考分配。不,接受的答案不是检查密钥是否在 array 中......它仍在使用普通索引器。仅仅因为它看起来 像数组访问并不意味着它 数组访问。 (数组访问首先不能通过字符串。)【参考方案2】:

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

【讨论】:

如果属性值为null怎么办? @AndreasFurster 然后它将返回一个JValue,其Valuenull,而不仅仅是null 如果属性可以是null,你可以使用x["error_msg"] is Object来检查属性是否在JSON对象中定义 @user3199329 这只是写x["error_msg"] != null的一种令人困惑的方式,所以不,它不检查属性是否存在并且具有null的值。 @WilliamT.Mallard 在 C# 6 中,您可以通过使用空条件索引运算符来简化它:myJObject["level1property"]?["level2property"]【参考方案3】:

JObject.ContainsKey(string propertyName) 已在 11.0.1 版本中作为公共方法

文档 - https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_ContainsKey.htm

【讨论】:

以上是关于json.net 有关键方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Json.NET 可以对流进行序列化/反序列化吗?

从 .NET 控制台调用 JSON WebService 的最佳方式

Json.net自定义字典格式

有啥方法可以获取有关 QNetworkAccessManager 队列的信息吗?

在序列化之前根据模式验证对象

Newtonsoft JSON.NET 与 Json Web 服务的兼容性