QJson 使用

来源:互联网 发布:淘宝动漫周边店成本 编辑:程序博客网 时间:2024/04/30 23:33

Converting JSON to QVariant

Converting JSON's data to QVariant instance is really simple:

1 // create a Parser instance2 QJson::Parser parser;3 4 bool ok;5 6 // json is a QString containing the data to convert7 QVariant result = parser.parse (json, &ok);

Suppose you're going to convert this JSON data:

 1 { 2   "encoding" : "UTF-8", 3   "plug-ins" : [ 4       "python", 5       "c++", 6       "ruby" 7       ], 8   "indent" : { "length" : 3, "use_space" : true } 9 }

The following code would convert the JSON data and parse it:

 1 QJson::Parser parser; 2 bool ok; 3  4 QVariantMap result = parser.parse (json, &ok).toMap(); 5 if (!ok) { 6   qFatal("An error occurred during parsing"); 7   exit (1); 8 } 9 10 qDebug() << "encoding:" << result["encoding"].toString();11 qDebug() << "plugins:";12 13 foreach (QVariant plugin, result["plug-ins"].toList()) {14   qDebug() << "\t-" << plugin.toString();15 }16 17 QVariantMap nestedMap = result["indent"].toMap();18 qDebug() << "length:" << nestedMap["length"].toInt();19 qDebug() << "use_space:" << nestedMap["use_space"].toBool();

The output would be:

1 encoding: "UTF-8"2 plugins:3   - "python"4   - "c++"5   - "ruby"6 length: 37 use_space: true

Converting QVariant to JSON

Converting a QVariant instance into a JSON object is really simple:

 1 QVariantList people; 2  3 QVariantMap bob; 4 bob.insert("Name", "Bob"); 5 bob.insert("Phonenumber", 123); 6  7 QVariantMap alice; 8 alice.insert("Name", "Alice"); 9 alice.insert("Phonenumber", 321);10 11 people << bob << alice;12 13 QJson::Serializer serializer;14 QByteArray json = serializer.serialize(people);15 16 qDebug() << json;

The output will be:

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

QObjct serialization and vice-versa

It's also possible to serialize a QObject instance to JSON. All the class attributes defined as properties will be serialized. Suppose the declaration of Person class looks like this:

 1 class Person : public QObject 2 { 3   Q_OBJECT 4  5   Q_PROPERTY(QString name READ name WRITE setName) 6   Q_PROPERTY(int phoneNumber READ phoneNumber WRITE setPhoneNumber) 7   Q_PROPERTY(Gender gender READ gender WRITE setGender) 8   Q_PROPERTY(QDate dob READ dob WRITE setDob) 9   Q_ENUMS(Gender)10 11 public:12     Person(QObject* parent = 0);13     ~Person();14 15     QString name() const;16     void setName(const QString& name);17 18     int phoneNumber() const;19     void setPhoneNumber(const int  phoneNumber);20 21     enum Gender {Male, Female};22     void setGender(Gender gender);23     Gender gender() const;24 25     QDate dob() const;26     void setDob(const QDate& dob);27 28   private:29     QString m_name;30     int m_phoneNumber;31     Gender m_gender;32     QDate m_dob;33 };

The following code will serialize an instance of Person to JSON:

 1 Person person; 2 person.setName("Flavio"); 3 person.setPhoneNumber(123456); 4 person.setGender(Person::Male); 5 person.setDob(QDate(1982, 7, 12)); 6  7 QVariantMap variant = QObjectHelper::qobject2qvariant(&person); 8 Serializer serializer; 9 qDebug() << serializer.serialize( variant);

The generated output will be:

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

It's also possible to initialize a QObject using the values stored inside of a QVariantMap. Suppose you have the following JSON data stored into a QString:

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

The following code will initialize an already allocated instance of Person using the JSON values:

1 Parser parser;2 QVariant variant = parser.parse(json);3 4 Person person;5 QObjectHelper::qvariant2qobject(variant.toMap(), &person);

API

The full documentation of QJson can be found here.

原创粉丝点击