对于可能的愚蠢问题,我深表歉意,但是...
我有以下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
是什么以及它可以包含什么可能会有所帮助。JToken
是JObject
,JProperty
,JArray
和JValue
的抽象基类。这些都代表可以出现在JSON中的构造。JObject
是JProperty
对象的集合。它不能包含其他任何内容。JProperty
本质上是键值对。它有一个Name
是字符串,还有一个Value
是另一个JToken
而不是JProperty
。
考虑到这一点,我们可以回答这个问题。JObject["key"]
使用给定的键在JProperty
中查找JObject
,并返回JToken
,它是Value
的JProperty
部分(如果找不到键,则为null)。JToken.First
返回给定JToken
的第一个孩子。对于JObject
,第一个孩子是JProperty
(不是Value
的JProperty
)。对于JProperty
,第一个(也是唯一的)孩子是Value
的JProperty
。
他们为什么不一样工作?
好吧,如果JObject["key"]
方法返回的是JProperty
而不是其值,那么您将无法执行jsonObject["key1"]["key2"]["key3"]
。相反,您必须使用更麻烦的语法jsonObject["key1"].Value["key2"].Value["key3"]
。
相反,如果JToken.First
总是返回Value
的JProperty
,那么您将永远无法使用它来发现Name
的JProperty
。 (如果您正在使用此方法,则可能您尚不知道该属性的名称,而如果您正在使用另一种方法,则您确实会知道它。)此外,导航属性(例如Next
,Prev
,等等将无法正常工作,因为您处于层次结构中的错误级别。
关于c# - 为什么我需要在Json.Net的foreach/Select()中调用.First()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19200353/