使用qtjson读取文件是大家在做java工作经常遇到的,但是有些开发人员在工作中读取中文文件的时候失败了,这是怎么回事呢?下面来我们就来给大家讲解一下。
中文经常出现乱码,解析失败的情况:
类似上边的情况,我们明明使用的是中文字符,但是显示的时候是乱码的,这个时候我们可以使用以下几个办法。
出现上边的问题就是QString要求字符串字面量是 UTF-8 编码的字节。
方法一
直接在源文件中添加:
#pragma execution_character_set("utf-8")
简单粗暴,直接明了。
方法二
在出现中文字符的地方使用"u8"进行申明一下:
QString str(u8"中文");
如果程序中的中文字符不多的话是可以,但是如果程序中的字符太多的话建议使用第一种方法。
方法三
QString::fromLocal8Bit("中文");
方法三与方法二类似,都是使用函数进行一些转化。
qt解析json方法是什么?
QT中使用json还是比较方便的,下面用例子直接说明:
QT使用json需要包含的头文件
#include < qjsondocument.h > #include<qjsonarray.h>#include<qjsonobject.h>#include<qjsonvalue.h>
//简单的QTJson数据 QJsonObject simp_ayjson; simp_ayjson.insert("name", "LLH"); simp_ayjson.insert("age", 20); simp_ayjson.insert("myAccounts", QString::fromLocal8Bit("123你好")); QJsonDocument document; document.setObject(simp_ayjson); QByteArray simpbyte_array = document.toJson(QJsonDocument::Compact); QString simpjson_str(simpbyte_array); qDebug() << QString::fromLocal8Bit("简单的QTJson数据:") << simpjson_str;
输出结果:
"简单的QTJson数据:" "{\"age\":20,\"myAccounts\":\"123你好\",\"name\":\"LLH\"}"
解析方法是:
//简单的QT解析JSON QJsonParseError simp_json_error; QString name, myAccount; int age; //QTJSON所有的元素 QJsonDocument simp_parse_doucment = QJsonDocument::fromJson(simpjson_str.toUtf8(), & simp_json_error); //检查json是否有错误 if (simp_json_error.error == QJsonParseError::NoError) { if (simp_parse_doucment.isObject()) { //开始解析json对象 QJsonObject obj = simp_parse_doucment.object(); //如果包含name if (obj.contains("name")) { //的到name QJsonValue name_value = obj.take("name"); if (name_value.isString()) { //转换name name = name_value.toVariant() .toString(); } } if (obj.contains("myAccounts")) { QJsonValue myAccount_value = obj.take("myAccounts"); if (myAccount_value.isString()) { myAccount = myAccount_value.toString(); } } if (obj.contains("age")) { QJsonValue age_value = obj.take("age"); if (age_value.isDouble()) { age = age_value.toVariant() .toInt(); } } } } qDebug() << QString::fromLocal8Bit("简单的QT解析出来的数据:") << name << "," << age << "," << myAccount;
解析结果:
"简单的QT解析出来的数据:" "LLH" , 20 , "123你好"
其实这种json能满足一般的要求但是有些特殊数据要求json里面带有json数组就需要复杂一点的json了,来吧让我们继续。
复杂的json生成代码:
//复杂的QTJson数据 QJsonArray arrays; for (int i = 0; i < 5; i++) { arrays.insert(i, QString::fromLocal8Bit("你好:%1") .arg(i)); } QJsonObject complex_json; complex_json.insert("name", "LLHlllll"); complex_json.insert("age", 201); complex_json.insert("myAccounts", QString::fromLocal8Bit("123你好llll")); complex_json.insert("arrays", arrays); QJsonDocument complex_document; complex_document.setObject(complex_json); QByteArray complex_byte_array = complex_document.toJson(QJsonDocument::Compact); QString complex_json_str(complex_byte_array); qDebug() << "\n" << QString::fromLocal8Bit("复杂的QTJson数据:") << complex_json_str;
输出结果:
"复杂的QTJson数据:" "{\"age\":201,\"arrays\":[\"你好:0\",\"你好:1\",\"你好:2\",\"你好:3\",\"你好:4\"],\"myAccounts\":\"123你好llll\",\"name\":\"LLHlllll\"}"
那么让我们来看看复杂的json如何解析吧:
//复杂的QT数据解析 QJsonParseError complex_json_error; QJsonDocument complex_parse_doucment = QJsonDocument::fromJson(complex_json_str.toUtf8(), & complex_json_error); if (complex_json_error.error == QJsonParseError::NoError) { if (complex_parse_doucment.isObject()) { //开始解析json对象 QJsonObject jsonObject = complex_parse_doucment.object(); if (jsonObject.contains("name")) { QJsonValue groupName_value = jsonObject.take("name"); if (groupName_value.isString()) { name = groupName_value.toString(); } } if (jsonObject.contains("myAccounts")) { QJsonValue myAccount_value = jsonObject.take("myAccounts"); if (myAccount_value.isString()) { myAccount = myAccount_value.toVariant() .toString();; } } if (jsonObject.contains("age")) { QJsonValue groupIndex_value = jsonObject.take("age"); if (groupIndex_value.isDouble()) { age = groupIndex_value.toVariant() .toInt();; } } if (jsonObject.contains("arrays")) { QJsonValue arrays_value = jsonObject.take("arrays"); if (arrays_value.isArray()) //判断他是不是json数组 { QJsonArray heeloArray = arrays_value.toArray();; for (int i = 0; i < heeloArray.size(); i++) { QJsonValue helloArrayValue = heeloArray.at(i); if (helloArrayValue.isString()) { qDebug() << "\n" << QString::fromLocal8Bit("输出复杂的json:") << helloArrayValue.toString(); } } } } } }
可以看到复杂的json解析代码有点长,原因可能是QT喜欢w3c就是docment元素的解析风格,也就是docment树解析,把数据加载成一颗树,然后在进行解析,好处是速度快,缺点是需要大量内存,代码虽然长点但是好理解,因为每一步都他的解析方式。
解析结果:
"输出复杂的json:" "你好:0" "输出复杂的json:" "你好:1" "输出复杂的json:" "你好:2" "输出复杂的json:" "你好:3" "输出复杂的json:" "你好:4"
虽然qt解析json方法有些复杂,但这也是工作中经常遇到的,因此要求程序员一定要多操作,掌握解析技巧。最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。
推荐阅读: