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

时间:2015-01-16 11:05:48

标签: c++ jsoncpp

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

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

Value& operator[] (const char *key)

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

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

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

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

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

如果没有一个丑陋的const_cast,有什么明智的方法可以做我想要的吗?

1 个答案:

答案 0 :(得分:1)

Wintermute是正确的。

考虑一下你的用例。希望它适合以下其中一个:

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

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