如何合并两个 JObject? [复制]

Posted

技术标签:

【中文标题】如何合并两个 JObject? [复制]【英文标题】:How can I merge two JObject? [duplicate] 【发布时间】:2014-02-05 06:35:27 【问题描述】:

我有第一个 json:


    "data": [
      "id": "id1",
      "field": "field1"
    ],
    "paging": 
        "prev": "link1",
    

还有第二个:


    "data": [
      "id": "id2",
      "field": "field2"
    ],
    "paging": 
        "prev": "link2",
    

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


    "data": [
      "id": "id1",
      "field": "field1"
    ,
    
      "id": "id2",
      "field": "field2"
    ]  

(我现在不关心paging)。

我怎样才能又快又容易地做到这一点?这是我的尝试:

var final = JsonConvert.SerializeObject(new  data = json1["data"].Union(json2["data"]) , Newtonsoft.Json.Formatting.Indented).ToString();

但引发异常:'Newtonsoft.Json.Linq.JArray' does not contains a definition of 'Union'

【问题讨论】:

【参考方案1】:

Newtonsoft.Json 现在supports merging objects (old link):

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));

(用大脑编译器检查;))

【讨论】:

我想提一下现代,现代 C# 语法允许像 dataObject1.SelectToken("data") as JArray 这样丑陋的东西变得更干净:(JArray)dataObject1["data"] @eltoro 我个人更喜欢这种方式:if (dataObject1["data"] is JArray jsonArr)。因为它允许您确保对象与类型匹配。否则,您可能会引入空对象引用异常。防御性编码 imo 是最好的。 这个答案很有帮助,给了我一个提示,我可以如何替换 javascript/ECMAScript “spread” 运算符来快速组合其他对象的对象;现在我可以从其他 JObject 中合并一个 JObject,太棒了!【参考方案2】:
JArray dataOfJson1=json1.SelectToken("data");

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

foreach(JObject innerData in dataofJson2) 

    dataOfJson1.Add(innerData);

【讨论】:

json1对象的数据类型是什么? json1和json2的数据类型都是JObject,JObject json1 = JObject.Parse(data1); // 第一个 JSON 字符串 JObject json2 = JObject.Parse(data2); // 第二个 JSON 字符串【参考方案3】:

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

public static JObject mergeJsonObjects(List<JObject> objects) 

    JObject json = new JObject();
    foreach(JObject JSONObject in objects) 
        foreach(var property in JSONObject) 
            string name = property.Key;
            JToken value = property.Value;

            json.Add(property.Key, property.Value);
        
    

    return json;

该方法接受一个 JObject 列表并返回单个 JObject,简单而有效。

【讨论】:

只是好奇,内部 foreach 之后的两行是什么意思? string name = property.Key; JToken value = property.Value; 我假设它是用于调试或其他什么,或者您的代码通常对这些值执行某些操作,但您删除了它(并且忘记删除变量集代码)......但也许我错过了什么?【参考方案4】:

一个可能的解决方案是:

class Container

    public List<IdField> dataget;set;


class IdField

    public string idget;set;
    public string fieldget;set;



string s1 = " \"data\": [ \"id\": \"id1\", \"field\": \"field1\" ], \"paging\":  \"prev\": \"link1\",  ";
string s2 = " \"data\": [ \"id\": \"id2\", \"field\": \"field2\" ], \"paging\":  \"prev\": \"link2\",  ";

var d1 = JsonConvert.DeserializeObject<Container>(s1);
var d2 = JsonConvert.DeserializeObject<Container>(s2);

d1.data.AddRange(d2.data);

var result = JsonConvert.SerializeObject(d1);

【讨论】:

以上是关于如何合并两个 JObject? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何合并两个 JSON 文件? [复制]

如何合并两个数据框? [复制]

如何使用 AWK 合并两个文件? [复制]

如何在响应中将两个变量合并为一个? [复制]

Python:如何合并两个不同大小的数据框? [复制]

如何在python中合并两个dict? [复制]