gpt4 book ai didi

json.net - JToken 不是 JObject 的引用吗?

转载 作者:行者123 更新时间:2023-12-05 01:31:04 24 4
gpt4 key购买 nike

我还没有注意到詹姆斯·牛顿·金写或谈到了什么 JToken is .我做出了错误的假设,认为它以某种方式持有对 JObject 的引用。 .这不是这些 LINQPad 语句所展示的情况:

var json = @"
{
""item"": {
""foo"": ""4"",
""bar"": ""42""
}
}
";

var jO = JObject.Parse(json);
var jToken = jO["item"]["foo"];

jToken = "5";

jO.ToString().Dump("jO");

jToken.Dump("jToken");

输出:
jO
{
"item": {
"foo": "4",
"bar": "42"
}
}

jToken
5

不应该 jO["item"]["foo"] == 5 ?

最佳答案

先说一下什么是 JToken 是。

  • JTokenJObject 的抽象基类, JArray , JPropertyJValue .
  • JObjectJProperty的合集对象。 A JObject不能容纳任何其他类型的 JToken .
  • JProperty是一个名称-值对。名称始终是字符串,值可以是任何类型的 JToken除了另一个 JProperty .
  • JArrayJToken 的数组除 JProperty 之外的任何类型的物体.
  • JValue表示一个 JSON 原始值。它可以包含字符串、数字、 bool 值、日期或空值。请注意 JValue是与所有其他 JToken 一样的引用类型。

  • 上述类旨在模拟 JSON spec .

    现在让我们谈谈你在做什么以及你在哪里感到困惑。

    在您的代码中,您首先要创建一个 JObject。 JObject 包含一个名为 item 的 JProperty . item的值是另一个包含两个 JProperties 的 JObject,名为 foobar .这些 JProperties 的值都是包含字符串的 JValues(分别为 442)。

    接下来,您使用 JToken 索引器语法来获取对 foo 的值的引用。 JProperty(包含字符串值 4 的 JValue)并将该引用分配给您的 jToken多变的。注意这个变量的声明类型是JToken,尽管这里的值的实际类型实际上是JValue。 (你可以看到这个,如果你这样做 jToken.GetType().Name.Dump("jToken type"))

    陪我到此为止?

    好的,这就是我认为您感到困惑的地方。 JToken 提供隐式和显式转换,允许从各种 .NET 原语分配或强制转换。如果你这样做 jToken = "5"这真的意味着与 jToken = new JValue("5") 相同的事情.所以你所做的就是替换你的 jToken 的引用变量(到包含 4 的 JValue)具有对包含 5 的不同 JValue 的新引用.这显然不会对原始 JObject 产生影响。

    如果您尝试修改原始 JValue 的值,则需要强制转换您的 jToken到 JValue 然后使用 Value setter 来设置它。
    ((JValue)jToken).Value = "5";

    fiddle : https://dotnetfiddle.net/StIGxM

    关于json.net - JToken 不是 JObject 的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38005957/

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