Qt之JSON生成与解析


  JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
常用的Json库
  • JsonCpp
    JsonCpp是一个C++用来处理JSON数据的开发包。    网址:http://jsoncpp.sourceforge.net/.
  • cJSON
    cJSON一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。    网址:http://sourceforge.net/projects/cjson/.
  • QJson
    QJson是一个基于Qt的开发包用来将JSON数据解析成QVariant对象,JSON的数组将被映射为QVariantList实例,而其他对象映射为QVariantMap实例。    网址:http://qjson.sourceforge.net/.
    关于Qt中对JSON的生成与解析,Qt5以前的版本,需要去进行单独下载、编译,才能使用。到了Qt5,提供了专门的QJsonDocument类来读取和写入JSON文档。
Qt5中JSON的生成与解析
  • QJsonDocument
    QJsonDocument既可以从一个基于文本表示的UTF-8编码,又可以从Qt自己的二进制格式读取和写入这个文件。    JSON文档可以从它的基于文本的表示使用QJsonDocument::fromJson()转换为QJsonDocument,用.toJSON()将其转换回文字。解析器非常快速和高效,将JSON转换为二进制表示。
  • QJsonObject
    QJsonObject类用于封装JSON对象。    JSON对象是键值对,其中键是唯一的字符串,其值由QJsonValue代表。一个QJsonObject可以从QVariantMap转换/被转换。
  • QJsonArray
    QJsonArray类用于封装JSON数组。    一个JSON数组列表值。该列表可以通过从阵列插入和移除QJsonValue的操纵。一个QJsonArray可以从QVariantList转换为/被转换。
    QJsonDocument有效解析后的文档可以使用!iSNull()判断。使用isArray()和isObject()来判断是否包含一个数组或对象。文档中包含的数组或对象可以使用array()或object()进行检索,然后读取或操纵。
示例QJsonObject(1)生成JsonQJsonObject json;json.insert("name", QString("Qt"));json.insert("version", 5);json.insert("windows", true);
QJsonDocument document;document.setObject(json);QByteArray byte_array = document.toJson(QJsonDocument::Compact);QString json_str(byte_array);

结果:json_str:{"name": "Qt","version": 5,"windows": true}
(2)解析JsonQJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error); if(json_error.error == QJsonParseError::NoError) {      if(parse_doucment.isObject())      {          QJsonObject obj = parse_doucment.object();         if(obj.contains("name"))          {      QJsonValue name_value = obj.take("name");    if(name_value.isString())    {        QString name = name_value.toString();    }if(obj.contains("version"))  {      QJsonValue version_value = obj.take("version");    if(version_value.isDouble())    {int version = version_value.toVariant().toInt();    }if(obj.contains("windows")){    QJsonValue version_value = obj.take("windows");    if(version_value.isBool())    {bool flag = version_value.toBool();    } }    }  }  
结果:name:Qtversion:5windows:true
QJsonArray(1)生成JsonQJsonArray json;json.insert(0, QString("Qt"));json.insert(1, QString("version"));json.insert(2, true);
QJsonDocument document;document.setArray(json);QByteArray byte_array = document.toJson(QJsonDocument::Compact);QString json_str(byte_array);

结果:json_str:["Qt","version",true]
(2)解析JsonQJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error); if(json_error.error == QJsonParseError::NoError) {      if(parse_doucment.isArray())      {  QJsonArray array = parse_doucment.array(); int size = array.size();for(int i=0; i        {    QJsonValue value = array.at(i);    if(value.isString())    {QString name = value.toString();    }    else if(value.isBool())    {bool flag = value.toBool();    }}    }}
结果:数组不同下标对应的值0:Qt1:version2:true
    如上,简单介绍一下常用的JSON库以及Qt中对JSON的生成与解析,如需更多资料请参考官方文档,还是那句话,没有比助手更好、更专业的资料了!
注:    技术在于交流、沟通,转载请注明出处并保持作品的完整性。    作者:╰☆奋斗ing❤孩子`  原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101gnxm.html
//-----------------------------------------------------------------------------------------------------

上一章我们了解了如何使用 QJson 处理 JSON 文档。QJson 是一个基于 Qt 的第三方库,适用于 Qt4 和 Qt5 两个版本。不过,如果你的应用仅仅需要考虑兼容 Qt5,其实已经有了内置的处理函数。Qt5 新增加了处理 JSON 的类,与 XML 类库类似,均以 QJson 开头,在 QtCore 模块中,不需要额外引入其它模块。Qt5 新增加六个相关类:

QJsonArray封装 JSON 数组
QJsonDocument读写 JSON 文档
QJsonObject封装 JSON 对象
QJsonObject::iterator用于遍历QJsonObject的 STL 风格的非 const 遍历器
QJsonParseError报告 JSON 处理过程中出现的错误
QJsonValue封装 JSON 值

我们还是使用前一章的 JSON 文档,这次换用QJsonDocument 来解析。注意,QJsonDocument要求使用 Qt5,本章中所有代码都必须在 Qt5 环境下进行编译运行。


QStringjson("{"        "\"encoding\" : \"UTF-8\","        "\"plug-ins\" : ["        "\"python\","        "\"c++\","        "\"ruby\""        "],"        "\"indent\" : { \"length\" : 3, \"use_space\" : true }"        "}");QJsonParseErrorerror;QJsonDocumentjsonDocument=QJsonDocument::fromJson(json.toUtf8(),&error);if(error.error==QJsonParseError::NoError){    if(jsonDocument.isObject()){        QVariantMapresult=jsonDocument.toVariant().toMap();        qDebug()<<"encoding:"<<result["encoding"].toString();        qDebug()<<"plugins:";         foreach(QVariantplugin,result["plug-ins"].toList()){            qDebug()<<"\t-"<<plugin.toString();        }         QVariantMapnestedMap=result["indent"].toMap();        qDebug()<<"length:"<<nestedMap["length"].toInt();        qDebug()<<"use_space:"<<nestedMap["use_space"].toBool();    }}else{    qFatal(error.errorString().toUtf8().constData());    exit(1);}

这段代码与前面的几乎相同。QJsonDocument::fromJson()可以由QByteArray对象构造一个QJsonDocument对象,用于我们的读写操作。这里我们传入一个QJsonParseError对象的指针作为第二个参数,用于获取解析的结果。如果QJsonParseError::error()的返回值为QJsonParseError::NoError,说明一切正常,则继续以QVariant的格式进行解析(由于我们知道这是一个 JSON 对象,因此只判断了isObject()。当处理未知的 JSON 时,或许应当将所有的情况都考虑一边,包括isObject()isArray()以及isEmpty())。

也就是说,如果需要使用QJsonDocument处理 JSON 文档,我们只需要使用下面的代码模板:

12345678910111213141516// 1. 创建 QJsonParseError 对象,用来获取解析结果QJsonParseErrorerror;// 2. 使用静态函数获取 QJsonDocument 对象QJsonDocumentjsonDocument=QJsonDocument::fromJson(json.toUtf8(),&error);// 3. 根据解析结果进行处理if(error.error==QJsonParseError::NoError){    if(!(jsonDocument.isNull()||jsonDocument.isEmpty())){        if(jsonDocument.isObject()){            // ...        }elseif(jsonDocument.isArray()){            // ...        }    }}else{    // 检查错误类型}

QVariant对象生成 JSON 文档也很简单:

12345678910111213141516QVariantListpeople; QVariantMapbob;bob.insert("Name","Bob");bob.insert("Phonenumber",123); QVariantMapalice;alice.insert("Name","Alice");alice.insert("Phonenumber",321); people<<bob<<alice; QJsonDocumentjsonDocument=QJsonDocument::fromVariant(people);if(!jsonDocument.isNull()){    qDebug()<<jsonDocument.toJson();}

这里我们仍然使用的是QJsonDocument,只不过这次我们需要使用QJsonDocument::fromVariant()函数获取QJsonDocument对象。QJsonDocument也可以以二进制格式读取对象,比如QJsonDocument::fromBinaryData()QJsonDocument::fromRawData()函数。当我们成功获取到QJsonDocument对象之后,可以使用toJson()生成 JSON 文档。

以上介绍了当我们有一个 JSON 文档时,如何使用QJsonDocument进行处理。如果我们没有 JSON 文档,那么我们可以使用QJsonDocumentsetArray()setObject()函数动态设置该对象,然后再生成对应的 JSON 格式文档。不过这部分需求比较罕见,因为我们直接可以从QVariant值类型获取。

Qt5 提供的 JSON 类库直接支持隐式数据共享,因此我们不需要为复制的效率担心。

转自:http://www.devbean.net/2013/09/qt-study-road-2-qjsondocument/
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告