QJson

http://qjson.sourceforge.net/usage/

Usage

This page provides a quick overview of QJson’s features:

  • parsing: from JSON to QVariant.
  • serializing: from QVariant to JSON.
  • QObject helper: dump and restore QObject’s attributes.

For more details checkout QJson’s documentation.

Parsing: from JSON to QVariant

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

1
2
3
4
5
6
7
// create a Parser instance
QJson::Parser parser;

bool ok;

// json is a QString containing the data to convert
QVariant result = parser.parse (json, &ok);

Suppose you’re going to convert this JSON data:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
QJson::Parser parser;
bool ok;

QVariantMap result = parser.parse (json, &ok).toMap();
if (!ok) {
  qFatal("An error occurred during parsing");
  exit (1);
}

qDebug() << "encoding:" << result["encoding"].toString();
qDebug() << "plugins:";

foreach (QVariant plugin, result["plug-ins"].toList()) {
  qDebug() << "	-" << plugin.toString();
}

QVariantMap nestedMap = result["indent"].toMap();
qDebug() << "length:" << nestedMap["length"].toInt();
qDebug() << "use_space:" << nestedMap["use_space"].toBool();

The output would be:

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

Serialization: from QVariant to JSON

QVariant objects are converted to a string containing the JSON data.

Let’s declare a QVariant object with some data to convert:

1
2
3
4
5
6
7
8
9
10
11
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;

Now it’s time to create the Serializer:

1
2
3
4
5
6
7
8
9
QJson::Serializer serializer;
bool ok;
QByteArray json = serializer.serialize(people, &ok);

if (ok) {
  qDebug() << json;
} else {
  qCritical() << "Something went wrong:" << serializer.errorMessage();
}

The output will be:

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

It’s possible to tune the indentation level of the resulting string using the Serializer::setIndentMode() method.

QObject helper

QJson provides an helper class for dumping QObject’s attributes to a QVariant and for restoring QObject’s attributes from a QVariantMap.

Let’s define a simple class inhereted from QObject:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;
};

Dump QObject’s attributes to JSON

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

1
2
3
4
5
6
7
8
9
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);

The generated output will be:

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

Restore QObject’s attributes from JSON

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", "gender" : 0, "name" : "Flavio", "phoneNumber" : 123456 }

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

1
2
3
4
Parser parser;
QVariant variant = parser.parse(json);
Person person;
QObjectHelper::qvariant2qobject(variant.toMap(), &person);
原文地址:https://www.cnblogs.com/chinasoft/p/15217012.html