jsoncpp - C++ JsonCPP-从arrayValue中删除objectValue

标签 jsoncpp

我现在才使用jsonCPP库几个月。我试图添加和删除数组中的对象。香港专业教育学院在不同的平台上使用了许多不同的JSON库,但我发现使用JsonCPP很难。

这是杰森:

{   "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从数组值中删除对象值的“最佳实践”方法是什么?

最佳答案

我终于有一些时间来研究源代码,简单的答案是-

arrayValue对象实际上只是一个定义为std::map的ObjectValue。如果在映射中的对象上调用 std::map::erase(),您将中断该数组的连续序列index_ Key。 Sdt::Maps不允许您在 map 中编辑Key,因此您必须将 map 中的所有Value对象指针向上移动一个,并删除end()之前的最后一项才能真正“删除”该对象。

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

答案:。您必须先更改代码以清理 map ,才能从arrayValue中删除对象。

更多信息在这里:Changing the key of an element inside a std::map

关于jsoncpp - C++ JsonCPP-从arrayValue中删除objectValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12101955/

相关文章:

c++ - Jsoncpp问题

c++ - Jsoncpp - 当 Json::reader 超出范围时非常简单的测试崩溃

c++ - C++ 中的 Json : Parse a number as a string to avoid floating-point inaccuracy

linux - 如何使用 cmake 为 jsoncpp 0.10.7 指定共享库的安装目录?

c++ - jsoncpp operator= 中的 undefined reference

c++ - 如何完全删除json数组元素(使用jsoncpp)

c++ - 将 unsigned char * 转换为 json,jsonspp C++

c++ - 值成员的 jsoncpp 迭代器

c++ - JsonCpp 在退出函数时抛出 LogicError