QtでJSONを操作するためのライブラリとしてのQJson



こんにちは、Habr!



QtでJSONを操作するための優れた非常にシンプルなツールであるQJsonについては、まだhabrで書いていません。 一般的に、QtはXMLの使用を推奨していますが、非常に多くの場合、XMLは冗長すぎるか冗長であると思われます。 場合によっては、JSONを使用した方が良い場合があります。 この投稿では、QJsonをダウンロード、ビルド、使用してQtでJSONを操作する方法を紹介します。



注意! この投稿はメモです。 ここで読んだものはすべて、Googleとプロジェクトのオフサイトで見つけることができますが、そのようなメモは不要ではないと思います。





取得中



QJson-サードパーティ、それを使用するには、最初に取得して組み立てる必要があります。 これは、2つの方法で行うことができます- プロジェクトの公式Webサイトから、またはgi明な方法で 。 ダウンロードして開梱し、次の手順に進みます。



設置



QJson開発者は、cmakeを使用してビルドすることをお勧めします。





set PATH=%PATH%;C:\path_to_cmake_\bin cd path_where_i_unpacked_qjson cd build cmake -G "MinGW Makefiles" .. mingw32-make mingw32-make install
      
      







Linux / Mac



 cd where_i_downloaded_qjson mkdir build cd build cmake .. make sudo make install
      
      







はじめに



QJsonを使用すると、QVariant(QVariantMap、QVariantList)に基づいてJSONを操作できるため、柔軟性が得られます。 彼は、JSONの解析、作成、およびシリアル化の方法を知っています。



開始するには-.proファイルに次の行を追加します。

 LIBS += -lqjson
      
      







現在、私たちのプロジェクトはqjsonに依存しており、その操作方法を知っています。



パーシムQJson



 #include<qjson/parser.h> QVariant parseJSON(const QString &json) { QJson::Parser parser; //   json' bool ok; // false    return parser.parse (json, &ok); // QVariant }
      
      







このJSONを解析しましょう:

 { "encoding" : "UTF-8", "plug-ins" : [ "python", "c++", "ruby" ], "indent" : { "length" : 3, "use_space" : true } }
      
      







このコードは次のとおりです。

 QJson::Parser parser; bool ok; QVariantMap result = parser.parse (json, &ok).toMap(); if (!ok) { qFatal("    - -."); exit (1); } qDebug() << "encoding:" << result["encoding"].toString(); qDebug() << "plugins:"; foreach (QVariant plugin, result["plug-ins"].toList()) { qDebug() << "\t-" << plugin.toString(); } QVariantMap nestedMap = result["indent"].toMap(); qDebug() << "length:" << nestedMap["length"].toInt(); qDebug() << "use_space:" << nestedMap["use_space"].toBool();
      
      







デバッグコンソールへの出力は次のようになります。

 encoding: "UTF-8" plugins: - "python" - "c++" - "ruby" length: 3 use_space: true
      
      







QVariantからJSONへの書き込み



この例をここに残します。

 QVariantList people; QVariantMap bob; bob.insert("Name", "Bob"); bob.insert("Phonenumber", 123); QVariantMap alice; alice.insert("Name", "Alice"); alice.insert("Phonenumber", 321); people << bob << alice; QJson::Serializer serializer; QByteArray json = serializer.serialize(people); qDebug() << json;
      
      







デバッグコンソールの出力は次のようになります。

 "[ { "Name" : "Bob", "Phonenumber" : 123 }, { "Name" : "Alice", "Phonenumber" : 321 } ]"
      
      







すごいですね。



QObjectシリアル化



JSONでQObjectインスタンスをシリアル化することもできます。 すべてのクラス属性はプロパティとして定義され、順序付けされます。 クラス定義が次のようになっていると仮定します。

 class Person : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName) Q_PROPERTY(int phoneNumber READ phoneNumber WRITE setPhoneNumber) Q_PROPERTY(Gender gender READ gender WRITE setGender) Q_PROPERTY(QDate dob READ dob WRITE setDob) Q_ENUMS(Gender) public: Person(QObject* parent = 0); ~Person(); QString name() const; void setName(const QString& name); int phoneNumber() const; void setPhoneNumber(const int phoneNumber); enum Gender {Male, Female}; void setGender(Gender gender); Gender gender() const; QDate dob() const; void setDob(const QDate& dob); private: QString m_name; int m_phoneNumber; Gender m_gender; QDate m_dob; };
      
      







このコードはPersonオブジェクトをJSONに変換します:

 Person person; person.setName("Flavio"); person.setPhoneNumber(123456); person.setGender(Person::Male); person.setDob(QDate(1982, 7, 12)); QVariantMap variant = QObjectHelper::qobject2qvariant(&person); Serializer serializer; qDebug() << serializer.serialize( variant);
      
      







コンソールには次の出力が表示されます。

 { "dob" : "1982-07-12", "gender" : 0, "name" : "Flavio", "phoneNumber" : 123456 }
      
      







QObjectでJSONを解析することもできます。 上記のJSONがQStringにあると想像してください。

 Parser parser; QVariant variant = parser.parse(json); // json -  JSON  QString Person person; QObjectHelper::qvariant2qobject(variant.toMap(), &person); //   person   json
      
      







完全なAPI



ここで英語説明されています



私のコメント



誰がこの恩恵を受けることができますか? はい、誰でも! 簡単またはユーザーフレンドリーな形式で情報を保存する必要がある開発者。



ご清聴ありがとうございました。



All Articles