QJsonDocument提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
当前项目需要将大量结构体数据转换为json格式存储,此处我选择xpack(https://gitee.com/xyz347/xpack#基本用法),下载链接和使用方法原作者讲的足够清楚,因此不再赘述。我在使用过程主要是数据存储过程发现中文乱码。
提示:以下是本篇文章正文内容,下面案例可供参考
*.h文件
#include "xpack/json.h"
using namespace std;
struct LonLat_Struct
{
double dLon;
double dLat;
double dAlt;
XPACK(O(dLon, dLat, dAlt));
};
struct City_Struct
{
char qName[30];
LonLat_Struct llS;
XPACK(O(qName, llS));
};
*.cpp
struct转json格式string
QString str, str2;
QVector<City_Struct> csVec;
City_Struct cs, cs2;
QByteArray a = QString::fromLocal8Bit("武汉").toLocal8Bit();
memcpy(cs.qName, a.data(), a.size());
cs.llS.dLon = 112;
cs.llS.dLat = 32;
cs.llS.dAlt = 300;
csVec.append(cs);
//注意此处直接使用QString::fromStdString会乱码
str = QString::fromLocal8Bit(xpack::json::encode(cs).c_str());
QJsonParseError jsonError;
QJsonArray jsonArray;
//此处注意QJsonDocument::fromJson返回为null大部分使用为编码格式问题,utf8
QJsonDocument d = QJsonDocument::fromJson(str.toUtf8());
QJsonObject j1 = d.object();
jsonArray.append(j1);
a = QString::fromLocal8Bit("黄冈").toLocal8Bit();
memcpy(cs2.qName, a.data(), a.size());
cs2.llS.dLon = 112.8;
cs2.llS.dLat = 32.3;
cs2.llS.dAlt = 400;
csVec.append(cs2);
str2 = QString::fromLocal8Bit(xpack::json::encode(cs2).c_str());
jsonArray.append(QJsonDocument::fromJson(str2.toUtf8()).object());
QJsonDocument document;
document.setArray(jsonArray);
byte = QString::fromUtf8(document.toJson(QJsonDocument::Compact));
string解析转struct
QVector<City_Struct> csVec;
QJsonDocument document = QJsonDocument::fromJson(byte.toUtf8());
QJsonArray jsonArray = document.array();
int size = jsonArray.size();
for each (QJsonValue var in jsonArray)
{
City_Struct cs;
QString str = QJsonDocument(var.toObject()).toJson();
//注意此处同样QString转string
xpack::json::decode(string(str.toLocal8Bit()), cs);
csVec.append(cs);
}
本文出现中文乱码看似需要分析的地方比较多,实际如果我们按照xpack说明和熟悉qt json的使用方法后,基本可以确认问题是在QString和std::string互转过程出现。