gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:59:19 27 4
gpt4 key购买 nike

我现在才使用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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com