如何按组优雅地合并多个JObjects?

时间:2019-08-22 10:29:22

标签: c# linq

我这里有多个对象,如下所示

[
{"id": 1, "content": {"a": 1, "b": 2}},
{"id": 2, "content": {"a": 10, "b": 20}},
{"id": 1, "content": {"c": 3, "d": 4}}
]

我想按content(组)合并id。最后得到结果

[
{"id": 1, "content": {"a": 1, "b": 2, "c": 3, "d": 4}},
{"id": 2, "content": {"a": 10, "b": 20}}
]

2 个答案:

答案 0 :(得分:0)

您可以使用LINQ来查询分组依据。 https://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm

答案 1 :(得分:0)

这不是我认为的最优雅的方式,但是可以完成我认为的工作。我希望这是可以理解的。

string json = String.Empty;
using (var sr = new StreamReader(@"d:\Documents\asd.json"))
{
    json = sr.ReadToEnd();
}

JArray array = JArray.Parse(json);

for (int i = 0; i < array.Count - 1; i++)
{
    for (int j = i + 1; j < array.Count; j++)
    {
        if (array[i]["id"].ToString() == array[j]["id"].ToString())
        {
            foreach (var item in ((JObject)array[j]["content"]).Properties())
            {
                try
                {
                    ((JObject)array[i]["content"][item.Name]).Replace(item);
                }
                catch (Exception)
                {
                    ((JObject)(array[i]["content"])).Add(item);
                }
            }
            array.Remove(array[j]);
        }
    }
}

Console.WriteLine(array.ToString());

我认为您可以编写它的通用合并,而不会轻易烧毁价值。