初识Json
json是一种轻量级数据交换格式。json完全独立于语言的文本格式,但是使用了类似于C语言的的家族习惯。
常用的json库:
- JsonCpp:一个用c++处理josn的开发包:
- cJson
一个超轻巧,携带方便,单文件,简单的可作为ANSI-C标准的Json解析器
- QJson
QJson是Qt自带的开发包,可以将JSon数据解析为QVariant对象,JSon的数组将被映射为QVariantList实例,而其他对象映射为QVaraintMap实例。
下面是一个Json文档例子
接下来,我们使用QJon解析上述json文本:
QJson::Parser parser;
bool ok;
QString json("{"
"\"encoding\" : \"UTF-8\","
"\"plug-ins\" : ["
"\"python\","
"\"c++\","
"\"ruby\""
"],"
"\"indent\" : { \"length\" : 3, \"use_space\" : true }"
"}");
QVariantMap result = parser.parse(json.toUtf8(), &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() << "\t-" << plugin.toString();
}
QVariantMap nestedMap = result["indent"].toMap();
qDebug() << "length:" << nestedMap["length"].toInt();
qDebug() << "use_space:" << nestedMap["use_space"].toBool();
生成JSon对象
如果需要将
QVariant
生成 JSON 对象,我们则使用QJson::Serializer
对象
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;
bool ok;
QByteArray json = serializer.serialize(people, &ok);
if (ok) {
qDebug() << json;
} else {
qCritical() << "Something went wrong:" << serializer.errorMessage();
}
补充
上面是 QJson 的主要使用方法。其实 QJson 还提供了另外一个类QObjectHelper
,用于QVariant
和QObject
之间的转换。注意我们上面所说的 QJson 的转换需要的是QVariant
类型的数据,无论是转换到 JSON 还是从 JSON 转换而来。但是通常我们在应用程序中使用的是QObject
及其子类。QObjectHelper
提供了一个工具函数,完成QVariant
和QObject
之间的转换。例如我们有下面的类:
那么,我们可以使用下面的代码将Person
类进行 JSON 序列化:
以及: