2013-01-02 42 views
6

我有兩個JToken代表JSON數組對象,我想合併它們。 JToken有一個方法Concat,但它會產生null,因爲我嘗試使用它。通過連接包含的元素合併兩個Json.NET數組

Action<JToken> Ok = (x) => 
{ 
    Debug.WriteLine(x); 
    /* outputs 
    [ 
     { 
     "id": 1, 
     }, 
     { 
     "id": 2, 
     } 
    ] 
    */ 

    x = (x).Concat<JToken>(x) as JToken; 
    Debug.WriteLine(x); // null 
}; 

我該如何讓它工作?

+0

能否請你告訴你如何使用提供您的代碼+樣本數據'Concat'方法? – GameScripting

+0

@Game腳本很好的代碼是在這裏問題,特別是行'x =(x).Concat (x)作爲JToken'。 UPD:你能看到我提供的代碼塊嗎? – Anton

+0

哦,我很抱歉,你是絕對正確的。 – GameScripting

回答

5
JToken.FromObject(x.Concat(x)) 
1

我需要一樣,這就是我想出了

https://github.com/MrAntix/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Linq/MergeExtensions.cs

public static void MergeInto(
    this JContainer left, JToken right, MergeOptions options) 
{ 
    foreach (var rightChild in right.Children<JProperty>()) 
    { 
     var rightChildProperty = rightChild; 
     var leftPropertyValue = left.SelectToken(rightChildProperty.Name); 

     if (leftPropertyValue == null) 
     { 
      // no matching property, just add 
      left.Add(rightChild); 
     } 
     else 
     { 
      var leftProperty = (JProperty) leftPropertyValue.Parent; 

      var leftArray = leftPropertyValue as JArray; 
      var rightArray = rightChildProperty.Value as JArray; 
      if (leftArray != null && rightArray != null) 
      { 
       switch (options.ArrayHandling) 
       { 
        case MergeOptionArrayHandling.Concat: 

         foreach (var rightValue in rightArray) 
         { 
          leftArray.Add(rightValue); 
         } 

         break; 
        case MergeOptionArrayHandling.Overwrite: 

         leftProperty.Value = rightChildProperty.Value; 
         break; 
       } 
      } 

      else 
      { 
       var leftObject = leftPropertyValue as JObject; 
       if (leftObject == null) 
       { 
        // replace value 
        leftProperty.Value = rightChildProperty.Value; 
       } 

       else 
        // recurse object 
        MergeInto(leftObject, rightChildProperty.Value, options); 
      } 
     } 
    } 
} 
+0

'left.SelectToken(rightChildProperty.Name);'應該是'left [rightChildProperty.Name];'...至少在我的情況下(4.0 R8) –

20

使用JContainer.Merge()MergeArrayHandling.Concat

這可以從Json.NET 6 Release 4開始。所以如果你的陣列在JContainer(例如JObject),這是一個簡單而強大的解決方案。

例子:

JObject o1 = JObject.Parse(@"{ 
    'FirstName': 'John', 
    'LastName': 'Smith', 
    'Enabled': false, 
    'Roles': [ 'User' ] 
}"); 
JObject o2 = JObject.Parse(@"{ 
    'Enabled': true, 
    'Roles': [ 'Operator', 'Admin' ] 
}"); 

o1.Merge(o2, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat }); 

string json = o1.ToString(); 
// { 
// "FirstName": "John", 
// "LastName": "Smith", 
// "Enabled": true, 
// "Roles": [ 
//  "User", 
//  "Operator", 
//  "Admin" 
// ] 
// } 
相關問題