2016-12-17 13 views
0

私はQTで連想JSON配列を解析する方法を知りたいと思います。QTで連想JSON配列を解析する方法は?

QJsonDocument doc=QJsonDocument::fromJson(data.toUtf8()); 
QJsonObject jobj=doc.object(); 
QJsonValue params_value=jobj.value(QString("params")); 
QJsonArray params_array=params_value.toArray(); 

{ 
    "req_code": 5, 
    "params": { 
     "email":"[email protected]", 
     "password":"123" 
    } 
} 

ので、メールを取得するために( 'データ' と呼ばれるJSON文字列から)私はこのような何かをしなければならないでしょう:

この

は私の例JSONです

'params_array'オブジェクトに 'email'が格納されていますが、この配列はQHashではなく、QMapではありません。 QHashなら、私はメールを受け取るでしょう:

QString email=params_array.value("email"); 

しかし、それはハッシュではありません、それはベクトルです。では、この場合、「電子メール」プロパティの価値を適切かつ迅速に取得するにはどうすればよいですか?

+0

JSONの例では、 'params'の値はオブジェクトであり、配列ではありません。 –

+0

@ O'Neil Ok。 QJsonObject型でもある 'jobj'変数からQJsonObjectを取得するにはどうしたらいいですか?ドキュメントにはそのようなメソッドはありません。ほとんどのメソッドはQJsonValueを返しています。 – Nulik

+0

QJsonArrayの代わりに[QJsonValue :: toObject()](http://doc.qt.io/qt-5/qjsonvalue.html#toObject-1)を使用して、 'QJsonValue params_value'をQJsonObjectに変換するだけで済みます。 –

答えて

1

paramsの値がオブジェクトであり、QJsonObjectはそう、あなたが簡単にアクセスすることができmap-like functionsを提供しています。

auto doc = QJsonDocument::fromJson(data.toUtf8()); 
auto docObj = doc.object(); 
auto paramsObj = docObj["params"].toObject(); 
auto email = paramsObj["email"]; 

そしてdocumentationは言う:

すべてJSONクラスが値基づいており、暗黙的に共有されるクラス。

あなたは本当にパフォーマンスを大切にする必要はありません。 QJsonObjectをハッシュまたはマップに変換する場合は、QJsonObject::toVariantHashまたはQJsonObject::toVariantMapを使用できます。

+0

ご迷惑をおかけして申し訳ありませんが、 "価値に基づく"クラスは何ですか?それについてGoogleのドキュメントを見つけることができません。 – Nulik

+0

これはすべてが値渡しであることを意味します。たとえば、 'QJsonValue :: toObject'は参照ではなく値で新しいオブジェクトを返します。しかし、オブジェクトは暗黙的にshared_です。内部ポインタのみがコピーされ、パフォーマンスについて心配する必要はありません。 – mcchu

+0

ありがとう、私のコードをコンパイルし、テストしました。 – Nulik

0

これを試してください。

 QJsonArray params_array = jobj.value("params").toArray(); 
     qDebug() << "params_array:: results array size = " << params_array.count(); 
     foreach (const QJsonValue & value, a) 
     { 
      QJsonObject obj = value.toObject(); 
      qDebug() << "obj keys " << obj.keys() ; 
      // here you can access your data, verify your keys with the debug a 
     } 
+0

ですが、ここでキーを検索するアレイ全体をスキャンしています。長い配列の場合、これは非効率的です。 JSON配列をQHashまたはQMapに変換するフォームはありませんか? – Nulik