C ++ JsonCPP - 从arrayValue中删除objectValue

时间:2012-08-24 00:54:42

标签: jsoncpp

我现在只使用jsonCPP lib几个月了。我试图添加和删除数组中的对象。我在不同的平台上使用了许多不同的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从数组值中删除对象值的“最佳实践”方法是什么?

3 个答案:

答案 0 :(得分:5)

我终于有时间深入研究源代码,简单的答案是 -

arrayValue对象实际上只是一个定义为std :: map的ObjectValue。如果在地图中的对象上调用 std :: map :: erase(),则会中断数组的连续序列index_ Key。 Sdt :: Maps不允许您在地图中编辑Key,因此您必须将地图中的所有Value对象指针向上移动一个并删除end()之前的最后一个条目以实际“delete”< / em>对象。

这听起来像很多开销。为什么我要把所有东西都搬了? ......你可能会问。因为JsonCPP Writer Classes使用map []索引来打印出值。如果找不到密钥(因为系列中存在间隙),则返回该索引的nullValue。当您调用root.toStyledString()转换回字符串时,就会看到这一点。过了一会儿,你到处都有这些“ null,”。从Value对象中,如果您调用const版本(const Value &operator[]( ArrayIndex index ) const;),则会将nullValue对象插入到Array中。解析器使用Value::operator[]( ArrayIndex index )版本将新的dafaultValue对象插入到地图中,同时将其标记为JSON。

答案:。您无法在不更改代码的情况下从arrayValue中删除对象以清理地图。

此处有更多信息:Changing the key of an element inside a std::map

答案 1 :(得分:2)

现在有removeIndex(),但正如tommygr所说,在当前实施中这是一项昂贵的操作。

答案 2 :(得分: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;