gpt4 book ai didi

c++ - jsoncpp:按名称访问 JSON 对象,返回可变引用,如果找不到则不创建对象

转载 作者:行者123 更新时间:2023-11-30 05:48:56 29 4
gpt4 key购买 nike

我正在使用 jsoncpp 来操作 JSON 字符串。将字符串解析为 Json::Value 后,我想访问并可能更改其中一个嵌套对象(如果存在)。如果嵌套对象不存在,我不想创建它。

查看 json documentation似乎返回对对象的引用的唯一方法是通过 operator[]。

Value& operator[] (const char *key)

按名称访问对象值,如果不存在则创建一个空成员。

const Value& operator[] (const char *key) const

按名称访问对象值,如果不存在具有该名称的成员,则返回 null。

我需要结合这两者语义的东西:我想要一个可变引用,但如果对象不存在则不涉及创建对象。 (我理解为什么 Json::Value 接口(interface)是这样设计的:返回一个可变引用会暴露它的内部 null 对象。)

我能看到的唯一干净的方法是使用 Json::Value::isMember 来确定对象是否存在,然后使用 Value& operator[] 来访问对象。但这涉及两次 O(log N) 查找而不是一次,我可能想避免这种情况。

除了丑陋的 const_cast 之外,还有什么明智的方法可以做我想做的事吗?

最佳答案

Wintermute 是正确的。

考虑您的用例。希望它符合以下之一:

  • 如果存在不常见,那么第二次查找只是一个很小的成本。
  • 如果普遍存在,则使用operator[]()get(),后跟removeMember()当您需要删除您创建的对象时。

但如果您提出的功能对您非常重要,我们可以添加一个新方法:
bool Value::get(char const* key, Value** got);
这将导致您自己的 Value* 指向该成员,但前提是它存在。 (我想我们甚至可以删除 bool 并在找不到时简单地设置 *gotten = nullptr。)如果您对此感兴趣,file an issue .

关于c++ - jsoncpp:按名称访问 JSON 对象,返回可变引用,如果找不到则不创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27982631/

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