【问题标题】:how to move duplicate json objects array in c#如何在c#中移动重复的json对象数组
【发布时间】:2022-11-03 19:33:30
【问题描述】:
{
    "data": [
        {
            "country": "China",
            "color" : "Red",
            "pet" : "Cat",
            "name" : "Mark",
            "height_unit_name" : "cm"
        },
        {
            "country": "China",
            "color" : "black",
            "pet" : "dog",
            "name" : "Jane",
            "height_unit_name" : "cm"
        }
    ]
}

我想将重复数据移到每个数组之外并像这样显示一次...... 像“country”和“height_unit_name”一样,它们在每个数组中都是相同的。

{
    "country": "China",
    "height_unit_name": "cm",
    "data": [
        {           
            "color": "Red",
            "pet": "Cat",
            "name": "Mark"
        },
        {
            "color": "black",
            "pet": "dog",
            "name": "Jane"
        }
    ]
}

谢谢你的帮助

【问题讨论】:

  • 这些是什么类型的物体?它们是 JsonObjects 吗?如果是这样,你能把它们放在描述它们的记录中吗?
  • 你有没有尝试过自己解决它?如果您已经有任何代码,会更容易提供帮助。
  • @AoooR 不。我从查询中得到了列表。但我不知道如何处理
  • @MarengoHue 是的,我自己试过了。但是,还是不知道该怎么办。如上所述,这是我从查询中获得的与我相似的示例数据。我不确定我是否必须查询两次
  • (抱歉我的英语不好)

标签: c# json visual-studio


【解决方案1】:

你真正想做的是:

  1. 以某种结构化的object 反序列化 JSON。我在示例中使用了“RawData”和RawItem

          string json = "{    "data": [        {            "country": "China",            "color" : "Red",            "pet" : "Cat",            "name" : "Mark",            "height_unit_name" : "cm"        },        {            "country": "China",            "color" : "black",            "pet" : "dog",            "name" : "Jane",            "height_unit_name" : "cm"        }    ]}";
         RawData rawData = JsonConvert.DeserializeObject<RawData>(json);
    
  2. 将原始数据作为列表后,您可以执行 GroupBy。在您的情况下,您按countrycolor 分组。

    List<Item> items = new List<Item>();
    var groupedData = rawData.data.GroupBy(x => new { country = x.country, color = x.color });
    
  3. 然后创建所需的对象结构。

      foreach (var item in groupedData)
      {
          List<Data> data = new List<Data>();
    
          foreach (var dataItem in item)
          {
              data.Add(new Data { pet = dataItem.pet, name = dataItem.name, height_unit_name = dataItem.height_unit_name });
          }
          items.Add(new Item { country = item.Key.country, color = item.Key.color, data = data });
      }
    
  4. 序列化新创建的结构。

    Console.WriteLine(JsonConvert.SerializeObject(items));
    

    .net fiddle 上的完整运行示例: https://dotnetfiddle.net/s4Q4LV

【讨论】:

    【解决方案2】:

    你可以为此使用 linq

        var jsonArr = (JArray)JObject.Parse(json)["data"];
        var data = jsonArr.GroupBy(a => new { c = (string)a["country"], h = (string)a["height_unit_name"], }).Select(b => new
        {
            country = b.Key.c,
            height_unit_name = b.Key.h,
            data = b.Select(a => new
            {
                color = (string)a["color"],
                pet = (string)a["pet"],
                name = (string)a["name"]
            }).ToList()
        }).ToList();
    

    如果需要,您可以创建自定义类而不是匿名类

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 2022-08-18
      • 2019-08-27
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      相关资源
      最近更新 更多