Объединить объекты json с одинаковым значением свойства c#

#c# #arrays #json #linq #.net-core

#c# #массивы #json #linq #.net-ядро

Вопрос:

Как объединить объекты JSON в одном ответе с одинаковым ключом и значением. например, если у меня есть два объекта с одинаковым языком: Python, я хочу объединить их и перечислить оставшиеся данные на этом языке Python, я не хочу, чтобы это повторялось

 [
  [
    {
      "language": "Python",
      "id": 319029846,
      "full_Name": "beurtschipper/Depix",
      "name": "Depix"
    },
    {
      "language": "Python",
      "id": 319169382,
      "full_Name": "benwilber/boltstream",
      "name": "boltstream"
    },
    {
      "language": "Python",
      "id": 316899719,
      "full_Name": "r0ysue/r0capture",
      "name": "r0capture"
    }
  ],
  [
    {
      "language": "YARA",
      "id": 318029147,
      "full_Name": "fireeye/red_team_tool_countermeasures",
      "name": "red_team_tool_countermeasures"
    }
  ],
  [
    {
      "language": "TypeScript",
      "id": 313443335,
      "full_Name": "pmndrs/valtio",
      "name": "valtio"
    }
  ]
]
 

какую форму я хочу

 [
  [
    {
      "language": "Python",
      "id": [319029846, 319169382, 316899719],
      "full_Name": ["beurtschipper/Depix", "benwilber/boltstream", "r0ysue/r0capture"],
      "name": ["Depix", "boltstream", "r0capture"]
    }
  ],
  [
    {
      "language": "YARA",
      "id": 318029147,
      "full_Name": "fireeye/red_team_tool_countermeasures",
      "name": "red_team_tool_countermeasures"
    }
  ],
  [
    {
      "language": "TypeScript",
      "id": 313443335,
      "full_Name": "pmndrs/valtio",
      "name": "valtio"
    }
  ]
]
 

И это код, который я использую

     public class Items
    {
        [JsonPropertyName("language")]
        public string Language { get; set; }
        [JsonPropertyName("id")]
        public int Id { get; set; }

        [JsonPropertyName("name")]
        public  string Name { get; set; }

        [JsonPropertyName("full_name")]
        public string Full_Name { get; set; }
        public string total_count { get; set; }
    }

    public class Root
    {
        [JsonPropertyName("items")]
        public List<Items> Items { get; set; }
    }


        Root jObj2 = JsonConvert.DeserializeObject<Root>(readerResult);
        var result = jObj2.Items.Select(x => new
        {
            x.Language,
            x.Id,
            x.Full_Name,
            x.Name
        }).GroupBy(x => x.Language).ToArray();
        return new JsonResult(result);
 

Ответ №1:

GroupBy это хорошее место для начала. После того, как у вас есть группы, вам нужно выбрать отдельные свойства каждой группы в новый список:

 var result = jObj2.Items
    .GroupBy(x => x.Language)
    .Select(group => new
    {
        Language = group.Key,
        Ids = group.Select(x => x.Id).ToList(),
        FullNames = group.Select(x => x.Full_Name).ToList(),
        Names = group.Select(x => x.Name).ToList()
    })
    .ToArray();
 

Комментарии:

1. О, сэр, мне стыдно за то, насколько это просто, если я не пытался поместить эти идентификаторы, имена и т. Д. В список Ids = group.Select(x => x.Id).ToList(), , Но я столкнулся с тем, что они не являются списком, и я даже не подумал, что я должен использовать GroupBy перед выбором, и теперь я вроде знаю, как на самом деле работает GroupBy. если вы не возражаете, я бы задал еще один вопрос .. это то, что нужно знать, приходит с опытом или я плохо учился? и, конечно, спасибо, я очень ценю вашу помощь.

2. Чем чаще вы используете Linq, тем легче вам будет решать подобные задачи