9

jsonCPPlibを使用してから2か月しか経っていません。配列内のオブジェクトを追加および削除しようとしています。さまざまなプラットフォームでさまざまなJSONライブラリを使用しましたが、JsonCPPを使用するのは非常に難しいと感じています。

これがJsonです:

{   "type": "Disc", 
    "media": "DVD", 
    "adapter": "DVDCodecs", 
    "transportControls" : [
    {"Action":"Left", "ActionCode" : "1a"},
    {"Action":"Right", "ActionCode" : "2a"},
    {"Action":"Up", "ActionCode" : "1b"},
    {"Action":"Down", "ActionCode" : "4c"},
    {"Action":"Center", "ActionCode" : "5e"},
    {"Action":"OK", "ActionCode" : "5a"},
    {"Action":"SubTitles", "ActionCode" : "3b"},
    {"Action":"SubTitlesLang", "ActionCode" : "7d"},
    {"Action":"Audio", "ActionCode" : "7a"},
    {"Action":"Angle", "ActionCode" : "6a"},
    {"Action":"Next", "ActionCode" : "6c"},
    {"Action":"Previous", "ActionCode" : "8b"},
    {"Action":"DVDMenu", "ActionCode" : "8c"},
    {"Action":"Search", "ActionCode" : "8d"},
    {"Action":"Region", "ActionCode" : "3a"},
    {"Action":"Display", "ActionCode" : "2e"},
    {"Action":"RootMenu", "ActionCode" : "6b"},
    {"Action":"FastForward", "ActionCode" : "81"},
    {"Action":"Rewind", "ActionCode" : "8b"},
    {"Action":"FrameForward", "ActionCode" : "8c"},
    {"Action":"Parking"},
    {"Action":"Seekable"}
    ]
}

私は、transportControls配列との間でobjectValueを追加および削除しようとしています。オブジェクトを追加するために、私はこれを行ってきました:

Json::Value addObj;     
Json::Reader reader; 
reader.parse("{\"Action\":\"BlueButton\", \"ActionCode\" : \"9a\"}", addObj );

root["transportControls"].append( addObj );

これはうまくいくようです。これを行うためのよりエレガントな方法があれば、私はそれを知りたいと思います。

私の問題は、追加した後にどのように削除するかです。オブジェクト内のすべてのメンバーを削除できますが、実際にはarrayValueマップからオブジェクトが削除されていないようです。

JsonCPPを使用して配列値からオブジェクト値を削除する「ベストプラクティス」の方法は何ですか?

4

3 に答える 3

5

ようやくソース コードを掘り下げる時間ができましたが、簡単な答えは「いいえ」です。

arrayValue オブジェクトは、実際には std::map として定義された単なる ObjectValue です。マップ内のオブジェクトでstd::map::erase()を呼び出すと、配列の連続するシーケンス index_ Key が中断されます。Sdt::Maps ではマップ内の Key を編集できないため、実際にオブジェクトを「削除」するには、マップ内のすべての Value オブジェクト ポインターを 1 つ上に移動し、end() の前の最後のエントリを削除する必要があります。

それは多くのオーバーヘッドのように聞こえます。なぜすべてを上に移動する必要があるのですか? ...あなたは尋ねるかもしれません。JsonCPP ライター クラスは map[] インデックスを使用して値を出力するためです。キーが見つからない場合 (シリーズにギャップがあるため)、そのインデックスに対して nullValue を返します。root.toStyledString()これは、文字列に戻すために呼び出すときに表示されるものです。しばらくすると、これらの「null」がいたるところに表示されます。Value オブジェクトから、const バージョン ( ) を呼び出していないconst Value &operator[]( ArrayIndex index ) const;場合は、nullValue オブジェクトを配列に挿入します。パーサーはこの Value::operator[]( ArrayIndex index ) バージョンを使用して、JSON をトークン化する際に新しい dafaultValue オブジェクトをマップに挿入します。

回答:いいえ。コードを変更してマップをクリーンアップしない限り、arrayValue からオブジェクトを削除することはできません。

詳細はこちら: std::map 内の要素のキーを変更する

于 2012-09-13T22:52:32.860 に答える
3

現在はありますremoveIndex()が、 tommygr が言うように、現在の実装ではコストのかかる操作です。

于 2015-02-15T16:27:48.817 に答える
1
Json::Value new_items;
int c = 0;
for(int i = 0; i < items.size(); i++)
{
    if(items[i] != selected_item)
    {
        new_items[c] = items[i];
        c++;
    }
}
items = new_items;
于 2016-02-18T11:29:19.543 に答える