2016-07-19 41 views
1

我有變體和子變量,這個子變體是那些將在不同測試中出現的實體。如何在嵌套的json結構中合併重複的子記錄?

現在我想從json結構的嵌套子對象中刪除重複的子變體。

JSON結構:

[ 
    { 
    "ParentVariantName": "Variant1", 
    "TestList": [ 
     { 
     "TestId": 100, 
     "Version": 0, 
     "SubVariantsList": []  
     ] 
     }, 
     { 
     "TestId": 101, 
     "Version": 1.0, 
     "SubVariantsList": [ 
      { 
      "SourceSubVariantModel": { 
       "Id": 69, 
       "Name": "Abc", 
       "DiffPerc": 100 
      }, 
      "TargetSubVariantModel": { 
       "Id": 70, 
       "Name": "Pqr", 
       "DiffPerc": 200 
      } 
      }, 
      { 
      "SourceSubVariantModel": { 
       "Id": 70, 
       "Name": "Pqr", 
       "SourceValue": 200 
      }, 
      "TargetSubVariantModel": { 
       "Id": 71, 
       "Name": "Xyz", 
       "TargetValue":300 
      } 
      } 
     ] 
     }, 
     { 
     "TestId": 247, 
     "Version": 3.0, 
     "SubVariantsList": [] 
     }, 
     { 
     "TestId": 248, 
     "Version": 4.0, 
     "SubVariantsList": [] 
     }, 
     { 
     "TestId": 249, 
     "Version": 5.0, 
     "SubVariantsList": [] 
     }, 
     { 
     "TestId": 250, 
     "Version": 6.0, 
     "SubVariantsList": [] 
     } 
    ] 
    } 
] 

對於例如:在上述JSON結構爲TestId = 101

Id 70 is repeating 2 times and so i want to merge duplicate records並希望這樣輸出:

預期輸出:

[ 
    { 
    "ParentVariantName": "Variant1", 
    "TestList": [ 
     { 
     "TestId": 100, 
     "Version": 0, 
     "SubVariantsList": []  
     ] 
     }, 
     { 
     "TestId": 101, 
     "Version": 1.0, 
     "SubVariantsList": [ 
      { 
      "Id": 69, 
      "Name": "Abc", 
      "DiffPerc": 100 
      }, 
      { 
      "Id": 70, 
      "Name": "Abc", 
      "DiffPerc": 200 
      }, 
      { 
      "Id": 71, 
      "Name": "Abc", 
      "DiffPerc": 300 
      }, 
     ] 
     }, 
     { 
     "TestId": 247, 
     "Version": 3.0, 
     "SubVariantsList": [] 
     }, 
     { 
     "TestId": 248, 
     "Version": 4.0, 
     "SubVariantsList": [] 
     }, 
     { 
     "TestId": 249, 
     "Version": 5.0, 
     "SubVariantsList": [] 
     }, 
     { 
     "TestId": 250, 
     "Version": 6.0, 
     "SubVariantsList": [] 
     } 
    ] 
    } 
] 

這就是我努力:

foreach (var item in data) 
      { 
       foreach (var testList in item.TestList) 
       { 
        foreach (var cdList in testList.SubVariantsList) 
        { 
         if (list.Count == 0) 
         { 
          list.Add 
           (
            new 
            { 

            } 
           ) 
         }  
        } 
       } 
      } 
+0

在你的預期JSON你還沒有合併重複的,你剛纔被忽視的一個。你決定忽略重複的條件是什麼? –

+0

@Reddy:看到我的expedted json輸出,你會看到在TestId 101下我有2個Id,值爲70,在我的預期輸出中我合併了2條記錄,因爲兩者都是相同的。 –

回答

1

您需要定義一個類爲您的新SubVariantsList條目如果您還沒有這樣做並填充更新SubVariantsList一個新的列表時實例化。

在下面的示例中,我將Model定義爲這樣一個類。它還定義了UpsertToList()方法來幫助填充列表而不重複。

using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string json = @" 
[ 
    { 
    ""ParentVariantName"": ""Variant1"", 
    ..... Removed to save space. Insert your input JSON here with " changed to "" .... 
"; 
      var data = JsonConvert.DeserializeObject<dynamic>(json); 
      foreach (var item in data) 
       foreach (var test in item.TestList) 
       { 
        var list = new List<Model>(); 
        foreach (var pair in test.SubVariantsList) 
        { 
         Model.UpsertToList(list, pair.SourceSubVariantModel); 
         Model.UpsertToList(list, pair.TargetSubVariantModel); 
        } 
        test.SubVariantsList = Newtonsoft.Json.Linq.JToken.FromObject(list); 
       } 

      Console.WriteLine(JsonConvert.SerializeObject(data, Formatting.Indented)); 
      Console.ReadKey(); 
     } 
    } 

    class Model 
    { 
     public int Id; 
     public string Name; 
     public int DiffPerc; 

     public static void UpsertToList(List<Model> list, dynamic sourceObject) 
     { 
      var item = list.FindLast(model => sourceObject.Id == model.Id); 
      if (item == null) 
       list.Add(new Model(sourceObject)); 
      else 
       item.Update(sourceObject); 
     } 

     Model(dynamic sourceObject) 
     { 
      Id = sourceObject.Id; 
      Update(sourceObject); 
     } 

     void Update(dynamic sourceObject) 
     { 
      Name = sourceObject.Name; 
      var diffPerc = sourceObject["DiffPerc"]; 
      if (diffPerc == null) 
       diffPerc = sourceObject["SourceValue"]; 
      if (diffPerc == null) 
       diffPerc = sourceObject["TargetValue"]; 
      if (diffPerc != null) 
       DiffPerc = diffPerc; 
     } 
    } 
} 

注:我用Json.Net,所以你可能需要Install-Package Newtonsoft.Json