我为这个可能愚蠢的问题道歉,但是......
我有以下 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
的一部分(如果未找到 key ,则返回 null)。
JToken.First
返回给定 JToken
的第一个子级。对于JObject
,第一个 child 是 JProperty
(不是 Value
的 JProperty
)。对于JProperty
,第一个(也是唯一的) child 是 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/