【问题标题】:Remove itens from JSON string based on a comparison between two JSON strings - C#根据两个 JSON 字符串之间的比较从 JSON 字符串中删除项目 - C#
【发布时间】:2021-08-06 14:41:46
【问题描述】:

给定 2 个 JSON 字符串:

[
   {
      "id":"BA",
      "description":"BrandA",
      "values":[
         {
            "id":"CategoryA",
            "description":"CategoryA"
         },
         {
            "id":"CategoryB",
            "description":"CategoryB"
         },
         {
            "id":"CategoryC",
            "description":"CategoryC"
         },
         {
            "id":"CategoryD",
            "description":"CategoryD"
         },
         {
            "id":"CategoryE",
            "description":"CategoryE"
         },
         {
            "id":"CategoryF",
            "description":"CategoryF"
         },
         {
            "id":"CategoryG",
            "description":"CategoryG"
         },
         {
            "id":"CategoryH",
            "description":"CategoryH"
         }
      ]
   },
   {
      "id":"BB",
      "description":"BrandB",
      "values":[
         {
            "id":"CategoryA",
            "description":"CategoryA"
         },
         {
            "id":"CategoryB",
            "description":"CategoryB"
         },
         {
            "id":"CategoryC",
            "description":"CategoryC"
         }
      ]
   }
]

[
   {
      "id":"BA",
      "description":"BrandA",
      "values":[
         {
            "id":"CategoryA",
            "description":"CategoryA"
         },
         {
            "id":"CategoryC",
            "description":"CategoryC"
         }
      ]
   },
   {
      "id":"BB",
      "description":"BrandB",
      "values":[
         {
            "id":"CategoryB",
            "description":"CategoryB"
         }
      ]
   }
]

第一个是原始的。第二个是我想从原始值中删除的值。所以基本上,如果第一个和第二个 JSON 之间的品牌和类别匹配,无论元素的顺序如何,我都希望删除该匹配。

预期的结果会是这样的:

[
   {
      "id":"BA",
      "description":"BrandA",
      "values":[
         {
            "id":"CategoryB",
            "description":"CategoryB"
         },
         {
            "id":"CategoryD",
            "description":"CategoryD"
         },
         {
            "id":"CategoryE",
            "description":"CategoryE"
         },
         {
            "id":"CategoryF",
            "description":"CategoryF"
         },
         {
            "id":"CategoryG",
            "description":"CategoryG"
         },
         {
            "id":"CategoryH",
            "description":"CategoryH"
         }
      ]
   },
   {
      "id":"BB",
      "description":"BrandB",
      "values":[
         {
            "id":"CategoryA",
            "description":"CategoryA"
         },
         {
            "id":"CategoryC",
            "description":"CategoryC"
         }
      ]
   }
]

品牌 A 中的 A 类和 C 类以及品牌 B 中的 B 类已被删除。

根据一些研究,我使用https://github.com/wbish/jsondiffpatch.net,尝试使用它的功能,但到目前为止我还没有达到我想要的结果。此外,通过直接处理 JSON 来解决这个问题也不是必须的。如果有一个更简单的解决方案可以通过将它们转换为列表并使用诸如 LINQ 之类的东西来实现这一点,它也适用于我(尝试过,但没有设法找到进行这种比较的方法)。

提前致谢。

【问题讨论】:

    标签: c# json linq


    【解决方案1】:

    如果性能无关紧要,可以使用 JsonSerializer 和 LINQ:

    型号

    public class JsonModel
    {
        public class ValueModel
        {
            public string Id { get; set; }
            public string Description { get; set; }
        }
    
        public string Id { get; set; }
        public string Description { get; set; }
        public IEnumerable<ValueModel> Values { get; set; }
    }
    

    反序列化和 LINQ

    string json1Str = @"[...]";
    
    string json2Str = @"[...]";
    
    
    var opt = new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true };
    var json1 = System.Text.Json.JsonSerializer.Deserialize<List<JsonModel>>(json1Str, opt);
    var json2 = System.Text.Json.JsonSerializer.Deserialize<List<JsonModel>>(json2Str, opt);
    
    var result = json1.
        Join(json2, j1 => j1.Id, j2 => j2.Id, (j1, j2) => new JsonModel
        {
            Id = j1.Id,
            Description = j1.Description,
            Values = j1.Values.Where(j1 => !j2.Values.Select(val => val.Id).Contains(j1.Id))
        });
    Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(result, new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
    }
    

    结果

    [
      {
        "Id": "BA",
        "Description": "BrandA",
        "Values": [
          {
            "Id": "CategoryB",
            "Description": "CategoryB"
          },
          {
            "Id": "CategoryD",
            "Description": "CategoryD"
          },
          {
            "Id": "CategoryE",
            "Description": "CategoryE"
          },
          {
            "Id": "CategoryF",
            "Description": "CategoryF"
          },
          {
            "Id": "CategoryG",
            "Description": "CategoryG"
          },
          {
            "Id": "CategoryH",
            "Description": "CategoryH"
          }
        ]
      },
      {
        "Id": "BB",
        "Description": "BrandB",
        "Values": [
          {
            "Id": "CategoryA",
            "Description": "CategoryA"
          },
          {
            "Id": "CategoryC",
            "Description": "CategoryC"
          }
        ]
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多