2016-06-10 6 views
2

Как объединить эти два JTokens в один JToken. Похоже, это должно быть просто, но не может обойти это.Объединить два JTokens в один

{ 
    "data":[ 
    { 
     "ID":"53a1862000404a304942546b35519ba3", 
     "name":"Private Approval Process: Draft Document CPL", 
     "objCode":"ARVPTH" 
    }] 
} 

{ 
"data":[ 
    { 
     "ID":"53a1838200401324eb1ec66562e9d77d", 
     "name":"Private Approval Process: Draft Document CPL", 
     "objCode":"ARVPTH" 
    }] 
} 

Спасибо за помощь!

Это то, что я пытался до сих пор:

Я начал путем присвоения первого объекта к переменной Jtoken pageOne тогда я попробовал конкатенации его во второй переменной JToken allPages. У меня есть цикл, который возвращает несколько страниц с тремя полями. Конечная цель - захватить каждую страницу и создать большой J Token со всеми страницами в нем.

что-то вроде этого:

for (int page = 0; page <= recCount; page += 2000) 
{ 
//Get data 
pageOne = getJsonData(); 
allPages.Concat(pageOne); 
} 
return allPages; 
+0

Как насчет создания массива JToken []? –

+0

Какие усилия вы предприняли для достижения этой цели, укажите образец того, что вы сделали до сих пор. – din

ответ

3

Вы можете использовать JContainer.Merge(Object, JsonMergeSettings) слить одну JObject на другую. Обратите внимание, что JsonMergeSettings.MergeArrayHandling дает контроль над объединением массивов. Из MergeArrayHandling Enumeration documentation, возможные варианты слияния являются:

Concat 0 Concatenate arrays. 
Union 1 Union arrays, skipping items that already exist. 
Replace 2 Replace all array items. 
Merge 3 Merge array items together, matched by index. 

Таким образом, слияние с помощью MergeArrayHandling.Concat следующим образом, где allPages и pageOne оба типа JContainer (или подкласса, например, JObject):

JContainer allPages = null; 
var settings = new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Concat }; 
for (int page = 0; page <= recCount; page += 2000) 
{ 
    //Get data 
    var pageOne = (JContainer)getJsonData(page); 
    if (allPages == null) 
     allPages = pageOne; 
    else 
     allPages.Merge(pageOne, settings); 
} 
return allPages; 

дает:

{ 
    "data": [ 
    { 
     "ID": "53a1862000404a304942546b35519ba3", 
     "name": "Private Approval Process: Draft Document CPL", 
     "objCode": "ARVPTH" 
    }, 
    { 
     "ID": "53a1838200401324eb1ec66562e9d77d", 
     "name": "Private Approval Process: Draft Document CPL", 
     "objCode": "ARVPTH" 
    } 
    ] 
} 

При объединении с использованием Replace дает:

{ 
    "data": [ 
    { 
     "ID": "53a1838200401324eb1ec66562e9d77d", 
     "name": "Private Approval Process: Draft Document CPL", 
     "objCode": "ARVPTH" 
    } 
    ] 
} 

Если переменные типа JToken вам нужно будет бросить их JContainer. (JSON-примитивы, которые не являются контейнерами, не могут быть объединены.)

JsonMergeSettings.MergeNullValueHandling дает контроль над тем, следует ли объединять или игнорировать значения null, если требуется.

+0

Звучит здорово! мне действительно нужен Конкат. Как бы вы это написали? Будет ли это примерно так: 'object1.Concat (object2);' – JoseStack

+0

@JoseStack - добавлен пример вызова. – dbc

+0

По некоторым причинам 'JContainer Allpages;.' '' Allpages **** обыкновение давать мне возможность Merge ... я что-то отсутствует? – JoseStack

0

Вы можете объединить его так (или если бы у вас было это в массиве или списке, вы могли бы сделать группу linq по запросу, например, над свойством ID, это также было бы эффективно).

var data1 = JObject.Parse(@"{ 
      'data':[ 
      { 
      'ID':'53a1862000404a304942546b35519ba3', 
       'name':'Private Approval Process: Draft Document CPL', 
       'objCode':'ARVPTH' 
      }] 
     }"); 

     var data2 = JObject.Parse(@"{ 
      'data':[ 
      { 
      'ID':'53a1862000404a304942546b35519ba3', 
       'name':'Private Approval Process: Draft Document CPL', 
       'objCode':'ARVPTH' 
      }] 
     }"); 

     data1.Merge(data2, new JsonMergeSettings 
     { 
      MergeArrayHandling = MergeArrayHandling.Union 
     }); 

     string json = data1.ToString(); 
Смежные вопросы