2

我为这个可能愚蠢的问题道歉,但是......

我有以下 JSON (显然是简化的)

{
   “rgDescriptions”:{
      “32895951_0”:{
         "id":"32895951",
         “名称”:“猫”,
      },
      “61694787_0”:{
         "id":"61694787",
         “名称”:“狗”,
      }
   }
}

作为我的问题的一个简单示例,这有效:

jsonObject["rgDescriptions"]["32895951_0"]["name"]

但这不会:

jsonObject["rgDescriptions"].First()["name"]
//InvalidOperationException:  Cannot access child value on Newtonsoft.Json.Linq.JProperty.

为了让它工作,我需要把它改成这样:

jsonObject["rgDescriptions"].First().First()["name"]

这对我来说毫无意义,因为第一个对象jsonObject["rgDescriptions"]应该等同于["32895951_0"]. []运算符和返回一个JToken .First(),所以我真的不明白为什么["rgDescriptions"].First()不起作用,或者它真正应该代表什么。

谁能向我解释发生了什么事?

4

1 回答 1

3

JToken首先,回顾一下 a是什么以及它可以包含什么可能会有所帮助。

  • JToken是 、 和 的JObject抽象JPropertyJArrayJValue。这些都代表了可以出现在 JSON 中的结构。
  • AJObjectJProperty对象的集合。它不能包含任何其他内容。
  • AJProperty本质上是一个键值对。它有 a Namewhich 是一个字符串,而 a Valuewhich 是另一个JToken不是 a 的JProperty

考虑到这一点,我们可以回答这个问题。

JObject["key"]JProperty使用给定的键在 中找到JObject并返回JToken是 的Value一部分JProperty(如果未找到键,则返回 null )。

JToken.First返回给定的第一个孩子JToken。对于 a JObject,第一个孩子是 a JProperty(不是ValueJProperty)。对于 a JProperty,第一个(也是唯一的)孩子是ValueJProperty

为什么它们的工作方式不同?

好吧,如果该JObject["key"]方法返回 aJProperty而不是它的值,那么您将无法执行 jsonObject["key1"]["key2"]["key3"]. 相反,您必须使用更繁琐的语法jsonObject["key1"].Value["key2"].Value["key3"]

相反,如果JToken.First总是返回Valuea 的JProperty,那么您将永远无法使用它来发现NameJProperty。(如果您使用此方法,可能您还不知道该属性的名称,而如果您使用其他方法,您确实知道它。)此外,导航属性(如NextPrev等)也无法正常工作因为你会在层次结构中处于错误的级别。

于 2013-10-05T19:11:09.397 回答