初识Json

 json是一种轻量级数据交换格式。json完全独立于语言的文本格式,但是使用了类似于C语言的的家族习惯。

常用的json库:
  • JsonCpp:一个用c++处理josn的开发包:
  • cJson
一个超轻巧,携带方便,单文件,简单的可作为ANSI-C标准的Json解析器
  • QJson
QJson是Qt自带的开发包,可以将JSon数据解析为QVariant对象,JSon的数组将被映射为QVariantList实例,而其他对象映射为QVaraintMap实例。

下面是一个Json文档例子
1
2
3
4
5
6
7
8
9
{
  "encoding" : "UTF-8",
  "plug-ins" : [
      "python",
      "c++",
      "ruby"
      ],
  "indent" : { "length" : 3, "use_space" : true }
}

JSon文档实际上就是一个javaScript对象,也成Jon对象,以大括号作为起止符。其实质是不排序的键值对,其中键要求是string类型,值可以是任意类型。

比如上面的json对象中,键encoding的值是UTF-8,plug-ins的值是一个数组,在Json中数组以中括号表示,这个数组是一个字符串列表,分别有"python","c++", "ruby"三个对象;键indent的值是一个对象,这个对象有两个属性,lenth=3,use_space=true;

接下来,我们使用QJon解析上述json文本:

  1. QJson::Parser parser;
  2. bool ok;
  3. QString json("{"
  4. "\"encoding\" : \"UTF-8\","
  5. "\"plug-ins\" : ["
  6. "\"python\","
  7. "\"c++\","
  8. "\"ruby\""
  9. "],"
  10. "\"indent\" : { \"length\" : 3, \"use_space\" : true }"
  11. "}");
  12. QVariantMap result = parser.parse(json.toUtf8(), &ok).toMap();
  13. if (!ok) {
  14. qFatal("An error occurred during parsing");
  15. exit (1);
  16. }
  17. qDebug() << "encoding:" << result["encoding"].toString();
  18. qDebug() << "plugins:";
  19. foreach (QVariant plugin, result["plug-ins"].toList()) {
  20. qDebug() << "\t-" << plugin.toString();
  21. }
  22. QVariantMap nestedMap = result["indent"].toMap();
  23. qDebug() << "length:" << nestedMap["length"].toInt();
  24. qDebug() << "use_space:" << nestedMap["use_space"].toBool();
生成JSon对象
如果需要将QVariant生成 JSON 对象,我们则使用QJson::Serializer对象

  1. QVariantList people;
  2. QVariantMap bob;
  3. bob.insert("Name", "Bob");
  4. bob.insert("Phonenumber", 123);
  5. QVariantMap alice;
  6. alice.insert("Name", "Alice");
  7. alice.insert("Phonenumber", 321);
  8. people << bob << alice;
  9. QJson::Serializer serializer;
  10. bool ok;
  11. QByteArray json = serializer.serialize(people, &ok);
  12. if (ok) {
  13. qDebug() << json;
  14. } else {
  15. qCritical() << "Something went wrong:" << serializer.errorMessage();
  16. }
补充

上面是 QJson 的主要使用方法。其实 QJson 还提供了另外一个类QObjectHelper,用于QVariantQObject之间的转换。注意我们上面所说的 QJson 的转换需要的是QVariant类型的数据,无论是转换到 JSON 还是从 JSON 转换而来。但是通常我们在应用程序中使用的是QObject及其子类。QObjectHelper提供了一个工具函数,完成QVariantQObject之间的转换。例如我们有下面的类:

那么,我们可以使用下面的代码将Person类进行 JSON 序列化:

以及:






posted @ 2016-04-21 16:09  永不停息;  阅读(475)  评论(0编辑  收藏  举报