2014-01-16 259 views
11

我有一個第一JSON:如何合併兩個JObject?

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

和第二之一:

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

和我要合併/聯合兩個數據陣列,諸如:

{ 
    "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'

回答

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

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

foreach(JObject innerData in dataofJson2) 
{ 
    dataOfJson1.Add(innerData); 
} 
+0

json1對象的數據類型是什麼? – NovaDev

3

一個可能的解決辦法是:

class Container 
{ 
    public List<IdField> data{get;set;} 
} 

class IdField 
{ 
    public string id{get;set;} 
    public string field{get;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); 
30

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

(使用大腦編譯器檢查;))

2

對於那些(像我)不能使用新的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; 
} 

該方法接受一個JObjects列表並返回一個單獨的JObject,並且有效。

+0

只是好奇,在內部foreach後兩條線的重點是什麼?我認爲它是用於調試或者其他什麼的,或者你的代碼通常用這些值做某些事情,但是你刪除了它(並忘記刪除變量集代碼)...但也許我錯過了什麼? – Psyrus