我怎样才能合并两个JObject?

mar*_*zzz 15 .net c# json json.net

我有一个第一个json:

{
    "data": [{
      "id": "id1",
      "field": "field1"
    }],
    "paging": {
        "prev": "link1",
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个:

{
    "data": [{
      "id": "id2",
      "field": "field2"
    }],
    "paging": {
        "prev": "link2",
    }
}
Run Code Online (Sandbox Code Playgroud)

我想合并/联合两个数据数组,例如:

{
    "data": [{
      "id": "id1",
      "field": "field1"
    },
    {
      "id": "id2",
      "field": "field2"
    }]  
}
Run Code Online (Sandbox Code Playgroud)

(我现在不在乎paging).

我怎样才能快速轻松地完成?这是我的尝试:

var final = JsonConvert.SerializeObject(new { data = json1["data"].Union(json2["data"]) }, Newtonsoft.Json.Formatting.Indented).ToString();
Run Code Online (Sandbox Code Playgroud)

但是提出了一个例外: 'Newtonsoft.Json.Linq.JArray' does not contains a definition of 'Union'

Dav*_*her 35

Newtonsoft.Json现在支持合并对象:http:
//antix.co.uk/Blog/Merging-objects-using-JSON.NET

var dataObject1 = JObject.Parse(@"{
    ""data"": [{
        ""id"": ""id1"",
        ""field"": ""field1""
    }],
    ""paging"": {
        ""prev"": ""link1"",
    }
}");
var dataObject2 = JObject.Parse(@"{
    ""data"": [{
        ""id"": ""id2"",
        ""field"": ""field2""
    }],
    ""paging"": {
        ""prev"": ""link2"",
    }
}");

var mergeSettings = new JsonMergeSettings
{
    MergeArrayHandling = MergeArrayHandling.Union
};

// method 1
(dataObject1.SelectToken("data") as JArray).Merge(dataObject2.SelectToken("data"), mergeSettings);
// method 2
//dataObject1.Merge(dataObject2, mergeSettings);

var mergedArray = dataObject1.SelectToken("data") as JArray;

Console.WriteLine(mergedArray.ToString(Formatting.None));
Run Code Online (Sandbox Code Playgroud)

(用脑编译器检查;))


Dib*_*ibu 7

JArray dataOfJson1=json1.SelectToken("data");

JArray dataofJson2=json2.SelectToken("data");

foreach(JObject innerData in dataofJson2) 
{
    dataOfJson1.Add(innerData);
}
Run Code Online (Sandbox Code Playgroud)


Pat*_*man 6

对于那些(像我一样)无法使用新的 JSON.net 库的人。下面的方法是我使用的。

public static JObject mergeJsonObjects(List<JObject> objects) {
        
    JObject json = new JObject();
    foreach(JObject JSONObject in objects) {
        foreach(var property in JSONObject) {
            json.Add(property.Key, property.Value);
        }
    }

    return json;
}
Run Code Online (Sandbox Code Playgroud)

该方法获取 JObject 列表并返回单个 JObject,简单且有效。

  • 只是好奇,内部 foreach 之后的两行有什么意义?`string name = property.Key;` `JToken value = property.Value;` 我认为它是用于调试或其他什么,或者您的代码通常会对这些值执行某些操作,但您删除了它(并且忘记删除变量集代码)。 .但也许我错过了一些东西? (3认同)