2017-09-01 234 views
1

我有以下需求,我需要使用JSON.NET合并两个Json对象。 下面是示例代码如何使用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(); 

在上面的例子中,我要香蕉JSON合并到食品JSON

上面的代码工作,而不在突出显示的代码,如果bananajson没有“橙”财产已经在食物json

如果两者都具有相似的一组属性,上面的代码不起作用。 有什么方法可以使用linq来查找现有的元素,如果存在,我想合并json否则它将更新源与新的属性。

问候, 阿马尔

+0

你为什么不只是用它来代替循环。在这种情况下,您必须在合并之前用“”水果“”{:}包装香蕉标记:foodJsonToken.Merge(bananaToken,new JsonMergeSettings {MergeArrayHandling = MergeArrayHandling.Union }); – Rakib

回答

1

如果您的结构主要JSON总是可以创建两个类是相同的:

一)主类食品与水果 二)水果类领域的集合:颜色和大小

您可以轻松地添加/删除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);