9

我现在只使用 jsonCPP 库几个月了。我试图在数组中添加和删除一个对象。我在不同平台上使用了许多不同的 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 不允许您编辑映射中的键,因此您必须将映射中的所有值对象指针向上移动一个并删除 end() 之前的最后一个条目以实际“删除”对象。

这听起来像很多开销。为什么我必须把所有东西都搬上来?……你可能会问。因为 JsonCPP 编写器类使用 map[] 索引来打印出值。如果它没有找到键(由于系列中的间隙),它会为该索引返回 nullValue。这就是您调用root.toStyledString()转换回字符串时看到的内容。过了一会儿,你就会到处都是这些“”。从 Value 对象中,如果您调用 const 版本 ( const Value &operator[]( ArrayIndex index ) const;),您会将 nullValue 对象插入到数组中。解析器使用该 Value::operator[]( ArrayIndex index ) 版本将新的 dafaultValue 对象插入到地图中,同时对您的 JSON 进行标记。

回答:没有。如果不更改代码以清理地图,则无法从 arrayValue 中删除对象。

更多信息: 更改 std::map 中元素的键

于 2012-09-13T22:52:32.860 回答
3

有 now 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 回答