首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何向JObject添加JToken?

如何向JObject添加JToken?
EN

Stack Overflow用户
提问于 2013-03-14 23:45:25
回答 3查看 125.4K关注 0票数 89

我正在尝试使用JSON.Net将一些文本中的JSON对象添加到现有的JSON文件中。例如,如果我有如下的JSON数据:

代码语言:javascript
复制
  {
  "food": {
    "fruit": {
      "apple": {
        "colour": "red",
        "size": "small"
      },
      "orange": {
        "colour": "orange",
        "size": "large"
      }
    }
  }
}

我一直在尝试这样做:

代码语言:javascript
复制
var foodJsonObj = JObject.Parse(jsonText);
var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}");
var bananaToken = bananaJson as JToken;
foodJsonObj["food"]["fruit"]["orange"].AddAfterSelf(bananaToken);

但这会给出错误:"Newtonsoft.Json.Linq.JProperty cannot have multiple values."

实际上,我已经尝试了几种不同的方法,但似乎什么都不能实现。在我的示例中,我真正想做的是将新项添加到“水果”中。如果有更好的方法或者更简单的库可以使用,请告诉我。

EN

回答 3

Stack Overflow用户

发布于 2013-04-03 16:21:36

我认为您对JSON.Net中的什么可以容纳什么感到困惑。

  • JToken是任何类型的JSON值的通用表示。它可以是字符串、对象、数组、属性等。
  • JProperty是一个与名称成对的JToken值。它只能添加到JObject中,并且它的值不能是另一个JProperty.
  • A JObjectJProperties的集合。它不能直接持有任何其他类型的JToken

在您的代码中,您试图将一个JObject (包含“香蕉”数据的那个)添加到一个已经有值的JProperty ("orange")中(一个包含{"colour":"orange","size":"large"}JObject )。如您所见,这将导致错误。

您真正想要做的是将一个名为"banana“的JProperty添加到包含另一个水果JPropertiesJObject中。以下是修改后的代码:

代码语言:javascript
复制
JObject foodJsonObj = JObject.Parse(jsonText);
JObject fruits = foodJsonObj["food"]["fruit"] as JObject;
fruits.Add("banana", JObject.Parse(@"{""colour"":""yellow"",""size"":""medium""}"));
票数 146
EN

Stack Overflow用户

发布于 2015-06-14 12:40:12

TL;DR:您应该向JObject添加一个JProperty。很简单。索引查询将返回一个JValue,因此请了解如何获取JProperty :)

公认的答案并不是像看起来那样回答问题。如果我想在一个特定的JProperty之后特别地添加一个one,该怎么办?首先,让我们从真正让我头昏脑胀的术语开始。

  • JToken =所有其他类型的母亲。它可以是JValue、JProperty、JArray或JObject。这将为解析mechanism.
  • JValue = any Json值类型(string,int,boolean).
  • JProperty = any JValue或JContainer (见下文)与名称(标识符))提供模块化设计。例如,"name":"value".
  • JContainer =包含其他类型的所有类型的母类型( JValue).
  • JObject =包含JProperties
  • JArray集合的JObject,JContainer类型)=包含集合JValue或JContainer的JContainer类型。

现在,当您使用索引[]查询Json item时,您得到的是不带标识符的JToken,它可能是一个JContainer或JValue (需要强制转换),但是您不能在它后面添加任何东西,因为它只是一个值。你可以改变它本身,查询更深的值,但你不能在它后面添加任何东西,例如。

您实际上想要获取的是整个属性,然后根据需要在其后面添加另一个属性。为此,您可以使用JOjbect.Property("name"),然后创建另一个所需的JProperty,然后使用AddAfterSelf方法在此之后添加它。那你就完事了。

有关更多信息,请访问:http://www.newtonsoft.com/json/help/html/ModifyJson.htm

这是我修改过的代码。

代码语言:javascript
复制
public class Program
{
  public static void Main()
  {
    try
    {
      string jsonText = @"
      {
        ""food"": {
          ""fruit"": {
            ""apple"": {
              ""colour"": ""red"",
              ""size"": ""small""
            },
            ""orange"": {
              ""colour"": ""orange"",
              ""size"": ""large""
            }
          }
        }
      }";

      var foodJsonObj = JObject.Parse(jsonText);
      var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}}");

      var fruitJObject = foodJsonObj["food"]["fruit"] as JObject;
      fruitJObject.Property("orange").AddAfterSelf(new JProperty("banana", fruitJObject));

      Console.WriteLine(foodJsonObj.ToString());
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.GetType().Name + ": " + ex.Message);
    }
  }
}
票数 39
EN

Stack Overflow用户

发布于 2015-02-13 08:36:31

只需在您的bananaToken中添加.First就可以了:

foodJsonObj["food"]["fruit"]["orange"].Parent.AddAfterSelf(bananaToken .First);

.First基本上超越了{,使其成为JProperty而不是JToken.

@布莱恩·罗杰斯,谢谢我忘了带.Parent。编辑过的

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15413825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档