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

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

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

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

【问题讨论】:

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

标签: c# json json.net


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2019-06-12
    • 2013-04-20
    • 2011-03-27
    • 2012-02-23
    • 2011-06-01
    • 2014-07-15
    相关资源
    最近更新 更多