2016-10-13 3 views
0

Я пытаюсь создать документ, загрузив два json-файла. Последний загруженный файл занимает наивысший приоритет. В приведенном ниже примере item1.value1 от file B перезаписывает значение от file A. item1.value2item2 не существует в file A поэтому окончательный документ просто принимает значения от file B файла A:Как слить два json-файла с помощью quickjson

{ 
level1: { 
     level2: { 
       item1: { 
         value1: 20, 
         } 
       } 
} 

файл B:

{ 
    level1: { 
     item2{ 
       value1: 50 
       value2: 60,   
       } 
     level2: { 
      item1:{ 
         value1: 40 
         value2: 30, 
     } 
    } 
} 

моя цель:

{ 
    level1: { 
     item2{ 
      value1: 50 
      value2: 60,   
     } 
     level2: { 
      item1: { 
         value1: 40, 
         value2: 30, 
     } 
    } 
} 

Другой вопрос, когда Я использую диапазон для итерации по документу, только level1 итерации, как я могу пройти через весь DOM?

for (auto& m : document.GetObject()) 
    printf("Type of member %s is %s\n", 
     m.name.GetString(), kTypeNames[m.value.GetType()]); 

ответ

0

Я думаю, вы бы попробовать это (работает для меня):

void mergeObjects(rapidjson::Value &dstObject, rapidjson::Value &srcObject, rapidjson::Document::AllocatorType &allocator) 
{ 
    for (auto srcIt = srcObject.MemberBegin(); srcIt != srcObject.MemberEnd(); ++srcIt) 
    { 
     auto dstIt = dstObject.FindMember(srcIt->name); 
     if (dstIt != dstObject.MemberEnd()) 
     { 
      assert(srcIt->value.GetType() == dstIt->value.GetType()); 
      if (srcIt->value.IsArray()) 
      { 
       for (auto arrayIt = srcIt->value.Begin(); arrayIt != srcIt->value.End(); ++arrayIt) 
       { 
        dstIt->value.PushBack(*arrayIt, allocator); 
       } 
      } 
      else if (srcIt->value.IsObject()) 
      { 
       mergeObjects(dstIt->value, srcIt->value, allocator); 
      } 
      else 
      { 
       dstIt->value = srcIt->value; 
      } 
     } 
     else 
     { 
      dstObject.AddMember(srcIt->name, srcIt->value, allocator); 
     } 
    } 
} 
//... 
rapidjson::Document from; 
rapidjson::Document to; 
mergeObjects(to, from, to.GetAllocator()); 

Обратите внимание, типы узлов должны быть равны. Он дополнительно объединяет массивы путем конкатенации, а не замены.

Вы можете перебирать всю модель DOM с помощью рекурсии (как указано выше).

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^