c# - 为什么我需要在 Json.Net 的 foreach/Select() 中调用 .First() ?

标签 c# json.net

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

我有以下 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 可能会有所帮助。是什么以及它可以包含什么。

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

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

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

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

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

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

相反,如果 JToken.First总是返回ValueJProperty ,那么你将永远无法使用它来发现 Name JProperty的。 (如果您使用此方法,则可能您还不知道该属性的名称,而如果您使用其他方法,则您确实知道它。)此外,还有导航属性,例如 Next , Prev等将无法正常工作,因为您在继承体系中处于错误的级别。

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

相关文章:

c# - 委托(delegate)给私有(private)函数作为不同类中方法的参数

c# - 允许从接口(interface)转换为实现的通用约束

c# - 无法访问 Newtonsoft.Json.Linq.JValue 上的子值

c# - 如何在不使用 foreach 循环的情况下获取 JObject 的第一个子对象

c# - 使用 NUnit 进行数据驱动测试

c# - 如何在 C# 中拥有一组枚举值?

c# - 在 Linq (C#) 中动态交叉连接多个不同大小的集合

serialization - 使用 Json.net 往返 F# 可区分联合时出现问题

c# - json 需要一个属性 "@class"。如何在c#中定义

c# - JsonConverter 等效于 HTTP GET 参数