对于可能的愚蠢问题,我深表歉意,但是...

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

{
   "rgDescriptions":{
      "32895951_0":{
         "id":"32895951",
         "name":"Cat",
      },
      "61694787_0":{
         "id":"61694787",
         "name":"Dog",
      }
   }
}

As a simple example of my problem, this works:

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"][]运算符和.First()都返回JToken,所以我真的不明白为什么["rgDescriptions"].First()不起作用,或者它实际上应该代表什么。

谁能告诉我这是怎么回事?

最佳答案

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


JTokenJObjectJPropertyJArrayJValue的抽象基类。这些都代表可以出现在JSON中的构造。
JObjectJProperty对象的集合。它不能包含其他任何内容。
JProperty本质上是键值对。它有一个Name是字符串,还有一个Value是另一个JToken而不是JProperty


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

JObject["key"]使用给定的键在JProperty中查找JObject,并返回JToken,它是ValueJProperty部分(如果找不到键,则为null)。

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

他们为什么不一样工作?

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

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

关于c# - 为什么我需要在Json.Net的foreach/Select()中调用.First()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19200353/

10-10 07:28