2016-10-12 5 views
1

私はjsoncppを使用しています。以下のようなデータセットがあります。いくつかのノードを検索して配列要素を削除したい場合は、 {}で完全に取り除くことは可能ですか?jsoncell要素を完全に削除する方法(jsoncppを使用)

データの前に削除:削除した後

{ 
    "any" : [ 
    { 
     "any_id" : "a1", 
     "infos" : [ 
     { 
      "info_id" : "i1", 
      "path" : "", 
      "version" : "1.0" 
     } 
     ] 
    }, 
    { 
     "any_id" : "a2", 
     "infos" : [ 
     { 
      "info_id" : "i1", 
      "path" : "", 
      "version" : "1.0" 
     }, 
     { 
      "info_id" : "i2", 
      "path" : "D:\\", 
      "version" : "1.0" 
     }, 
     { 
      "info_id" : "i3", 
      "path" : "", 
      "version" : "1.0" 
     }, 
     { 
      "info_id" : "i4", 
      "path" : "D:\\", 
      "version" : "1.0" 
     } 
     ] 
    }, 
    { 
     "any_id" : "a3", 
     "infos" : [ 
     { 
      "info_id" : "i4", 
      "path" : "", 
      "version" : "1.0" 
     } 
     ] 
    } 
    ] 
} 

データ:C++での

{ 
    "any" : [ 
    { 
     "any_id" : "a1", 
     "infos" : [ 
     { 
      "info_id" : "i1", 
      "path" : "", 
      "version" : "1.0" 
     } 
     ] 
    }, 
    { 
     "any_id" : "a2", 
     "infos" : [ 
     { 
      "info_id" : "i1", 
      "path" : "", 
      "version" : "1.0" 
     }, 
     { 
     }, 
     { 
      "info_id" : "i3", 
      "path" : "", 
      "version" : "1.0" 
     }, 
     { 
     } 
     ] 
    }, 
    { 
     "any_id" : "a3", 
     "infos" : [ 
     { 
      "info_id" : "i4", 
      "path" : "", 
      "version" : "1.0" 
     } 
     ] 
    } 
    ] 
} 

を、私は次のコードを持って、配列の要素を削除するany_idとパスを探します。

for (Json::ValueIterator &itr_any = data["any"].begin(); 
     itr_any != data["any"].end(); ++itr_any) 
    { 
     if (0 == _stricmp((*itr_any)["any_id"].asString().c_str(), "a2")) 
     { 
      for (Json::ValueIterator &itr_res = (*itr_any)["infos"].begin(); 
       itr_res != (*itr_any)["infos"].end(); ++itr_res) 
      { 
       if (0 == _stricmp((*itr_res)["path"].asString().c_str(), "D:\\")) 
       { 
        (*itr_res).clear(); 
       } 
      } 
     } 
    } 

答えて

1

(*itr_res).clear();では、選択した配列のオブジェクトの内容を実際に空にしています。項目を削除する最も簡単な方法は、マッチする要素を除いた新しい配列を構築することですので

JsonCpp APIは、配列を操作するためのメソッドを公開していない:

for (Json::ValueIterator &itr_any = data["any"].begin(); itr_any != data["any"].end(); ++itr_any) 
    if (0 == _stricmp((*itr_any)["any_id"].asString().c_str(), "a2")) 
    { 
     Json::Value newArray = Json::arrayValue; 
     for (Json::ValueIterator &itr_res = (*itr_any)["infos"].begin(); itr_res != (*itr_any)["infos"].end(); ++itr_res) 
      if (_stricmp((*itr_res)["path"].asString().c_str(), "D:\\")) 
       newArray.append((*itr_res)); 
     (*itr_any)["infos"] = newArray; 
    } 
+0

おかげで、それは私がそれがで成し遂げるために管理するものです終わり :) – hghew

関連する問題