1

サーバークライアントプログラムを書いています。サーバーは C++ で記述されており、JSON 文字列を使用してデータを送信します。このライブラリは非常に役に立ち、すべてが機能しますが、質問が 1 つあります。文字列の JSON 配列を通常の C++ 配列に解析するにはどうすればよいですか? ドキュメントでメソッドを検索しましたが、見つかりませんでした。独自の関数を作成する必要がありますか?

例。sは JSON 文字列{"msg":"message", "content":["content1", "content2"]}です:

CJsonObject *obj = CJsonParser::Execute(s); 
string msg = (*obj)["msg"]->ToString();
string content = (*obj)["content"]->ToString();
cout << msg << endl; // message
cout << content << endl; // ["content1", "content2"]

しかし、「content1」、「content2」の配列/ベクトルが必要です。

4

3 に答える 3

2

動的タイプのオブジェクトを指す可能性CJsonObject::operator[]のある a を返すように見えます。つまり、 type のオブジェクトへのポインターを返します。確認することができます。const CJsonValue*CJsonArray(*obj)["content"]CJsonArraydynamic_cast<CJsonArray*>

CJsonArrayGetValue参照渡しを取りstd::vector<CJsonValue*>、配列からの値で埋めるメンバー関数が呼び出されます。

したがって、(テストされていない)次のようなことができます:

if (auto array = dynamic_cast<const CJsonArray*>((*obj)["content"])) {
  std::vector<CJsonValue*> vec;
  array->GetValue(vec);
  for (auto& value : vec) {
    std::cout << value->ToString() << std::endl;
  }
}

または同等の C++03:

if (const CJsonArray* array = dynamic_cast<const CJsonArray*>((*obj)["content"])) {
  typedef std::vector<CJsonValue*> ValueVector;
  ValueVector vec;
  array->GetValue(vec);
  for (ValueVector::iterator it = vec.begin(); it != vec.end(); it++) {
    std::cout << (*it)->ToString() << std::endl;
  }
}
于 2012-12-29T14:58:33.010 に答える
1

Json オブジェクトの実際の型を確認し、キャストを使用してオブジェクトを取得できCJsonArrayます。

動的キャストの後、結果のオブジェクトは でありCJsonArray、そのためのメソッドがありますgetValue

if (content.getType() == JV_ARRAY) {
  std::vector <CJsonValue*> values;

  (dynamic_cast<CJsonArray*>(content))->getValue(values);

}

valueベクトルには が含まれているため、各要素にCJsonValue使用できます。ToString()

于 2012-12-29T14:59:10.120 に答える
0

この目的でboost::spiritを使用することは、実行可能なオプションである可能性があります。JSONは非常に簡単に解析でき、boost::phoenixとの相互作用で配列を埋めることができます。

于 2012-12-29T14:49:09.993 に答える