qt解释json字符串的一个bug
2017-11-10 20:20
681 查看
作者:朱金灿
来源:http://blog.csdn.net/clever101
最近使用qt(我用的是qt5.6)解析json字符串,发现qt的一个bug,代码如下:
#include <QtCore/QCoreApplication>
#include <QDomComment>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <iostream>
#include<iomanip>
#include "json.h"
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
int QtJsonTest()
{
QJsonParseError jsonError;
QString qstrJson = "{\n \"result\": true,\n \"error\": \"\",\n \"data\": {\n \"User\": {\n \"Uid\": 20556426650023957,\n \"Username\": \"00B10C201D61\",\n \"Password\": \"e10adc3949ba59abbe56e057f20f883e\",\n \"Appid\": 9,\n \"Sex\": \"\",\n \"Email\": \"\",\n \"GroupId\": 0,\n \"ParentId\": 0,\n \"Status\": \"\",\n \"Registertime\": \"2017-11-10T10:35:38+08:00\",\n \"Nikename\": \"\",\n \"TelNumber\": \"\",\n \"Lastlogintime\": \"2017-11-10T19:37:28.305962078+08:00\",\n \"Role\": \"\",\n \"Address\": \"\",\n \"IconPath\": \"\",\n \"ImagePath\": \"\",\n \"Type\": 0,\n \"Admin\": false,\n \"Option\": \"\",\n \"Terminals\": null\n },\n \"sessionid\": \"62719fc6cd0fc53a5dad5fed77ebfbd3\",\n \"pushsessionid\": \"9_20556426650023957_4de289715bed48e21c919b48febd7ae2\"\n }\n}";
QJsonDocument json = QJsonDocument::fromJson(qstrJson.toUtf8(), &jsonError);
if (jsonError.error == QJsonParseError::NoError)
{
if (json.isObject())
{
QJsonObject rootObj = json.object();
if (rootObj.contains("data"))
{
QJsonValue data_value = rootObj.value(QString("data"));
QJsonObject contentObj = data_value.toObject();
if (contentObj.contains("User"))
{
QJsonValue user_value = contentObj.value(QString("User"));
QJsonObject userObj = user_value.toObject();
if (userObj.contains("Uid"))
{
QJsonValue UidValue = userObj.value("Uid");
QJsonValue::Type type = UidValue.type();
if (UidValue.isDouble())
{
double db = UidValue.toDouble();
QString info("QT解析json字符串结果:");
std::wcout << info.toStdWString()<< std::fixed << db << std::endl;
return 0;
}
}
}
}
}
}
return 1;
}
int JsoncppTest()
{
QString qstrJson = "{\n \"result\": true,\n \"error\": \"\",\n \"data\": {\n \"User\": {\n \"Uid\": 20556426650023957,\n \"Username\": \"00B10C201D61\",\n \"Password\": \"e10adc3949ba59abbe56e057f20f883e\",\n \"Appid\": 9,\n \"Sex\": \"\",\n \"Email\": \"\",\n \"GroupId\": 0,\n \"ParentId\": 0,\n \"Status\": \"\",\n \"Registertime\": \"2017-11-10T10:35:38+08:00\",\n \"Nikename\": \"\",\n \"TelNumber\": \"\",\n \"Lastlogintime\": \"2017-11-10T19:37:28.305962078+08:00\",\n \"Role\": \"\",\n \"Address\": \"\",\n \"IconPath\": \"\",\n \"ImagePath\": \"\",\n \"Type\": 0,\n \"Admin\": false,\n \"Option\": \"\",\n \"Terminals\": null\n },\n \"sessionid\": \"62719fc6cd0fc53a5dad5fed77ebfbd3\",\n \"pushsessionid\": \"9_20556426650023957_4de289715bed48e21c919b48febd7ae2\"\n }\n}";
Json::Reader reader;
Json::Value root;
if (reader.parse(qstrJson.toStdString(), root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
qint64 uid = root["data"]["User"]["Uid"].asInt64(); // 访问节点
QString info("Jsoncpp库解析json字符串结果:");
std::wcout << info.toStdWString() << uid << std::endl;
return 0;
}
else
{
return 1;
}
return 1;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
setlocale(LC_CTYPE, "chs");
QtJsonTest();
JsoncppTest();
getchar();
return 1;
}
代码编译环境为VS2013,Win7操作系统,unicode字符集,输出结果如下:
从上图可以看出jsoncpp的解析精度比qt5要高。通过查看qt源码也可以看出,qt对json类型的支持比较有限,仅支持以下类型:
jsoncpp支持json的类型比qt要多,具体是:
enum ValueType {
nullValue = 0, ///< 'null' value
intValue, ///< signed integer value
uintValue, ///< unsigned integer value
realValue, ///< double value
stringValue, ///< UTF-8 string value
booleanValue, ///< bool value
arrayValue, ///< array value (ordered list)
objectValue ///< object value (collection of name/value pairs).
};
来源:http://blog.csdn.net/clever101
最近使用qt(我用的是qt5.6)解析json字符串,发现qt的一个bug,代码如下:
#include <QtCore/QCoreApplication>
#include <QDomComment>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <iostream>
#include<iomanip>
#include "json.h"
#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
int QtJsonTest()
{
QJsonParseError jsonError;
QString qstrJson = "{\n \"result\": true,\n \"error\": \"\",\n \"data\": {\n \"User\": {\n \"Uid\": 20556426650023957,\n \"Username\": \"00B10C201D61\",\n \"Password\": \"e10adc3949ba59abbe56e057f20f883e\",\n \"Appid\": 9,\n \"Sex\": \"\",\n \"Email\": \"\",\n \"GroupId\": 0,\n \"ParentId\": 0,\n \"Status\": \"\",\n \"Registertime\": \"2017-11-10T10:35:38+08:00\",\n \"Nikename\": \"\",\n \"TelNumber\": \"\",\n \"Lastlogintime\": \"2017-11-10T19:37:28.305962078+08:00\",\n \"Role\": \"\",\n \"Address\": \"\",\n \"IconPath\": \"\",\n \"ImagePath\": \"\",\n \"Type\": 0,\n \"Admin\": false,\n \"Option\": \"\",\n \"Terminals\": null\n },\n \"sessionid\": \"62719fc6cd0fc53a5dad5fed77ebfbd3\",\n \"pushsessionid\": \"9_20556426650023957_4de289715bed48e21c919b48febd7ae2\"\n }\n}";
QJsonDocument json = QJsonDocument::fromJson(qstrJson.toUtf8(), &jsonError);
if (jsonError.error == QJsonParseError::NoError)
{
if (json.isObject())
{
QJsonObject rootObj = json.object();
if (rootObj.contains("data"))
{
QJsonValue data_value = rootObj.value(QString("data"));
QJsonObject contentObj = data_value.toObject();
if (contentObj.contains("User"))
{
QJsonValue user_value = contentObj.value(QString("User"));
QJsonObject userObj = user_value.toObject();
if (userObj.contains("Uid"))
{
QJsonValue UidValue = userObj.value("Uid");
QJsonValue::Type type = UidValue.type();
if (UidValue.isDouble())
{
double db = UidValue.toDouble();
QString info("QT解析json字符串结果:");
std::wcout << info.toStdWString()<< std::fixed << db << std::endl;
return 0;
}
}
}
}
}
}
return 1;
}
int JsoncppTest()
{
QString qstrJson = "{\n \"result\": true,\n \"error\": \"\",\n \"data\": {\n \"User\": {\n \"Uid\": 20556426650023957,\n \"Username\": \"00B10C201D61\",\n \"Password\": \"e10adc3949ba59abbe56e057f20f883e\",\n \"Appid\": 9,\n \"Sex\": \"\",\n \"Email\": \"\",\n \"GroupId\": 0,\n \"ParentId\": 0,\n \"Status\": \"\",\n \"Registertime\": \"2017-11-10T10:35:38+08:00\",\n \"Nikename\": \"\",\n \"TelNumber\": \"\",\n \"Lastlogintime\": \"2017-11-10T19:37:28.305962078+08:00\",\n \"Role\": \"\",\n \"Address\": \"\",\n \"IconPath\": \"\",\n \"ImagePath\": \"\",\n \"Type\": 0,\n \"Admin\": false,\n \"Option\": \"\",\n \"Terminals\": null\n },\n \"sessionid\": \"62719fc6cd0fc53a5dad5fed77ebfbd3\",\n \"pushsessionid\": \"9_20556426650023957_4de289715bed48e21c919b48febd7ae2\"\n }\n}";
Json::Reader reader;
Json::Value root;
if (reader.parse(qstrJson.toStdString(), root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
qint64 uid = root["data"]["User"]["Uid"].asInt64(); // 访问节点
QString info("Jsoncpp库解析json字符串结果:");
std::wcout << info.toStdWString() << uid << std::endl;
return 0;
}
else
{
return 1;
}
return 1;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
setlocale(LC_CTYPE, "chs");
QtJsonTest();
JsoncppTest();
getchar();
return 1;
}
代码编译环境为VS2013,Win7操作系统,unicode字符集,输出结果如下:
从上图可以看出jsoncpp的解析精度比qt5要高。通过查看qt源码也可以看出,qt对json类型的支持比较有限,仅支持以下类型:
enum Type { Null = 0x0, Bool = 0x1, Double = 0x2, String = 0x3, Array = 0x4, Object = 0x5, Undefined = 0x80 };
jsoncpp支持json的类型比qt要多,具体是:
enum ValueType {
nullValue = 0, ///< 'null' value
intValue, ///< signed integer value
uintValue, ///< unsigned integer value
realValue, ///< double value
stringValue, ///< UTF-8 string value
booleanValue, ///< bool value
arrayValue, ///< array value (ordered list)
objectValue ///< object value (collection of name/value pairs).
};
相关文章推荐
- Qt 中字符串转二进制中的一个Bug
- QT 字符串转换的一个BUG
- 自制java一个json字符串生产,虽然有很多bug,还是分享一下
- 从零开发一个完整的Android项目(四)——合成JSON字符串
- json-lib的一个BUG,Float型数据会失真
- mybatis 3.3.0的一个bug 时间与字符串
- json-lib-2.4.jar Bug,json字符串中value为"[value]"结构时,解析为数组,不会解析成字符串
- 如何识别一个字符串是否Json格式
- 一个可以将 json 字符串 直接绑定到 view 上的Android库
- 如何识别一个字符串是否Json格式
- 利用反射,自动将对象生成json字符串【反射应用的一个小DEMO】
- android中 把json字符串从文件中去除,转换为一个 自定义对象的list中
- 将服务端的一个JSON格式的字符串输出给客户端js,客户端接收到的字符串里双引号被转义成“ "”的解决方案
- 求解释一个蛋疼的bug
- eval解析JSON字符串的一个小问题
- 前端js如何生成一个json对象,并转化为json字符串
- 把配置文件以json字符串格式保存,并读取放到一个map中
- Qt技巧:Win7下打包发布Qt程序(解释的比较清楚,把exe和dll伪装合并成一个文件)
- 整型转字符串(convert int to char)优化实践——一个意外的BUG
- WCF使用Json传输的一个BUG