我现在只使用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从数组值中删除对象值的“最佳实践”方法是什么?
答案 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中删除对象以清理地图。
答案 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;