2

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

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

Value& operator[] (const char *key)

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

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

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

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

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

没有丑陋的 const_cast,有什么明智的方法可以做我想做的事吗?

4

1 回答 1

2

温特穆特是正确的。

想想你的用例。希望它适合以下之一:

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

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

于 2015-02-16T18:03:09.027 回答