如何使用JSON.NET合并两个json对象

时间:2017-09-01 03:39:54

标签: c# json.net

我有以下要求,我需要使用JSON.NET合并两个Json对象。 以下是示例代码

    string jsonText = @"
    {
      ""food"": {
        ""fruit"": {
          ""apple"": {
            ""colour"": ""red"",
            ""size"": ""small""
          },
          ""orange"": {
            ""colour"": ""orange"",
            ""size"": ""large""
          }
        }
      }
    }";

    var foodJsonObj = JObject.Parse(jsonText);
    var foodJsonToken = foodJsonObj.SelectToken("food.fruit") as JObject;
    var bananaJson = JObject.Parse(@"{ ""banana"" : { ""colour"": ""yellow"", ""size"": ""medium""}, ""simpletype"":""simplevalue"", ""orange"":{ ""newprop"": ""newpropvalue"" }  }");
    var bananaToken = bananaJson as JObject;

    foreach (var token1 in bananaToken)
    {
        **var existingTokens = foodJsonToken.Children();
        foreach (var item in existingTokens)
        {
            var existingObject = item as JObject;

        }
        if (existingTokens.Contains(token1.Key))
        {
            foodJsonToken.Merge(token1, new JsonMergeSettings
            {
                MergeArrayHandling = MergeArrayHandling.Union
            });
        }**
        else
        {
            foodJsonToken.Add(token1.Key, token1.Value);
        }
    }

    json = foodJsonToken.ToString();

在上面的例子中,我想将banana json合并到food json

上面的代码工作没有高亮的代码,如果bananajson没有“orange”属性已经在食品json

如果两者都有类似的属性集,则上面的代码不起作用。 有没有办法使用linq查找现有元素,如果存在,我想合并json,否则它将使用新属性更新源。

此致 阿玛尔

1 个答案:

答案 0 :(得分:1)

如果主json的结构始终相同,则可以创建两个类:

a)主要食物收集水果 b)具有字段的水果类:颜色和大小

您可以轻松添加/删除Food类集合中的任何水果。 您可以使用NewtonSoft库序列化/反序列化Food或Fruit类。

整个代码应如下所示:

[DataContract]  
class Food
{  
    [DataMember]  
    public ArrayList<Fruit> Fruit { get; set; }  
}

[DataContract]
class Fruit
{  
    [DataMember]  
    public string Name { get; set; }  

    [DataMember]  
    public string Colour { get; set; }  

    [DataMember]  
    public string Size{ get; set; }  
}

使用示例:

var sampleFoodInstanc = new Food();
sampleFoodInstance.Fruit.Add( new Fruit() { Name: "Apple", Colour: "Red", Size: "Big" } );

// serialize process
var sz = JsonConvert.SerializeObject( sampleFoodInstance );

// deserialize process
JsonConvert.DeserializeObject<Food>( sz );