2017-09-01 6 views
1

JSON.NETを使用して2つのJsonオブジェクトをマージする必要がある以下の要件があります。以下 サンプルコード上の例ではJSON.NETを使用して2つの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がある「オレンジ」性質を持っていない場合は、hightlightedコードなしで働いていますすでに食品に入っている場合

上記の両方のプロパティが同じ場合、上記のコードは機能しません。 linqを使用して既存の要素を見つける方法はありますか?存在する場合は、json以外の要素を新しいプロパティで更新するためにマージします。

よろしく、 アマール

+0

を。この場合、マージする前に "fruit" ":{}でバナナトークンをラップする必要があります:foodJsonToken.Merge(bananaToken、new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union }); – Rakib

答えて

1

あなたの構造主なJSONが常に同じである場合は、2つのクラスを作成することができます B果物のコレクションで

a)のメインクラスの食品を)フィールドを持つフルーツクラス:色とサイズ

フードクラスコレクションからフルーツを簡単に追加/削除できます。 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); 
関連する問題