2016-10-13 4 views
0

두 개의 json 파일을로드하여 문서를 작성하려고합니다. 마지막에로드 된 파일이 가장 높은 우선 순위를가집니다. 아래 예제에서 item1.value1file B에서 file A의 값을 덮어 씁니다. item1.value2item2 때문에 최종 문서는 file B 파일 A의 값을 취 file A에 존재하지 않습니다rapidjson을 사용하여 두 개의 json 파일을 병합하는 방법

{ 
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뿐입니다. iterated, 어떻게 전체 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 모델을 반복 할 수 있습니다.

희망이 있습니다.