2

jsoncpp を使用して JSON 文字列を操作しています。文字列を Json::Value に解析した後、ネストされたオブジェクトの 1 つにアクセスし、存在する場合は変更する可能性があります。ネストされたオブジェクトが存在しない場合は、作成したくありません。

json のドキュメントを見ると、オブジェクトへの参照を返す唯一の方法は operator[] を使用することです。

Value& operator[] (const char *key)

名前でオブジェクト値にアクセスし、存在しない場合は null メンバーを作成します。

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

名前でオブジェクト値にアクセスし、その名前のメンバーが存在しない場合は null を返します。

これらの両方のセマンティクスを組み合わせたものが必要です。変更可能な参照が必要ですが、オブジェクトがまだ存在しない場合は作成する必要はありません。(Json::Value インターフェースがこのように設計されている理由を理解しています。変更可能な参照を返すと、内部の null オブジェクトが公開されます。)

私が見ることができる唯一のきれいな方法は、Json::Value::isMember を使用してオブジェクトが存在するかどうかを判断し、次に Value& operator[] を使用してオブジェクトにアクセスすることです。しかし、これには 1 回ではなく 2 回の O( log N ) ルックアップが含まれるので、避けたいと思うかもしれません。

醜いconst_castを除いて、私が望むことを行う賢明な方法はありますか?

4

1 に答える 1

2

ウィンターミュートは正しいです。

ユースケースについて考えてみましょう。うまくいけば、次のいずれかに適合します。

  • 存在が珍しい場合、2 回目の検索はわずかなコストで済みます。
  • 存在が一般的である場合は、operator[]()またはを使用し、作成したオブジェクトを削除する必要がある場合get()は続けます。removeMember()

ただし、提案された機能が非常に重要である場合は、新しいメソッドを追加できます。 bool Value::get(char const* key, Value** gotten); これにより、独自のメソッドValue*がメンバーを指すようになりますが、それが存在する場合のみです。bool( を削除して、見つからない場合は単純に設定することもできると思い*gotten = nullptrます。) これに興味がある場合は、 issue を提出してください。

于 2015-02-16T18:03:09.027 に答える