gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:13:20 27 4
gpt4 key购买 nike

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

我有以下 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 中的结构。
  • A JObjectJProperty 的集合对象。它不能包含任何其他内容。
  • A JProperty本质上是一个键值对。它有一个 Name这是一个字符串,一个 Value这是另一个JToken那不是JProperty .

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

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

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

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

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

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com