当前位置: 首页 > 工具软件 > xpack > 使用案例 >

记录一次xpack使用乱码

尤俊誉
2023-12-01

QJsonDocument提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

当前项目需要将大量结构体数据转换为json格式存储,此处我选择xpack(https://gitee.com/xyz347/xpack#基本用法),下载链接和使用方法原作者讲的足够清楚,因此不再赘述。我在使用过程主要是数据存储过程发现中文乱码。


提示:以下是本篇文章正文内容,下面案例可供参考

一、pandas是什么?

*.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互转过程出现。

 类似资料: