2016-10-13 32 views
0

2つのjsonファイルをロードしてドキュメントを作成しようとしています。最後にロードされたファイルが最も優先されます。 以下の例では、item1.value1からfile Bは、file Aの値を上書きします。 item1.value2item2file Aには存在しないので、最終文書は、ちょうどfile B ファイルAから値をとります。rapidjsonを使用して2つの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です繰り返されると、どのように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モデル全体を反復処理できます。

希望します。

関連する問題