2017-09-01 270 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);