引言
之前将变量保存并在本地生成json文件,由于其中含有中文,导致生成的json文件出现乱码,或者就是生成的json文件没有乱码,但是读取生成的json文件时出现乱码,不能正常解析json.
示例
运行效果:
下面是生成的json文件的格式:
{"school":"数是中学","address":"湖南","grade":2,"number":12332
}```
和
```cpp
{"address": "胡说的","grade": 1,"number": 13234,"school": "海南"
}
项目的结构:
此项目是基于Qt Application的控制台程序。即
创建好项目之后,向项目中添加C++类文件,包含.h和.cpp文件,添加的时候选择基类QObject。选择基类是QObject的原因是为了可以使用信号槽。
下面是实现代码:
main.cpp
#include <QCoreApplication>
#include "jsongenrateparse.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);JsonGenrateParse j;return a.exec();
}
jsongenrateparse.h
#ifndef JSONGENRATEPARSE_H
#define JSONGENRATEPARSE_H#include <QObject>/********************************************======功能描述:=======1.生成含中文的json文件,2.解析含中文的json文件。注意:此文重要是生成的json文件中含有中文予以记录。
********************************************/class JsonGenrateParse : public QObject
{Q_OBJECT
public:explicit JsonGenrateParse(QObject *parent = nullptr);void createJson();//生成json文件void createQStringToJson();//创建json文件,直接使用QString变量赋值QString getExePath();//获取可执行文件的路径void readJsonFile();//读取本地json文件void readQStringToJson();//读取本地的json文件void parseJsonFile(QByteArray &byteArray);//解析json
signals:public slots:
};#endif // JSONGENRATEPARSE_H
jsongenrateparse.cpp
#include "jsongenrateparse.h"
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QFile>
#include <QCoreApplication>
#include <QDebug>JsonGenrateParse::JsonGenrateParse(QObject *parent) : QObject(parent)
{createJson();readJsonFile();qDebug()<<"=================";createQStringToJson();readQStringToJson();
}QString JsonGenrateParse::getExePath()
{return QCoreApplication::applicationDirPath();
}void JsonGenrateParse::createJson()
{QJsonObject rootObject;rootObject.insert("school",QString::fromLocal8Bit("数是中学"));//从utf-8编码转换为本地编码rootObject.insert("address",QString::fromLocal8Bit("湖南"));rootObject.insert("grade",2);rootObject.insert("number",12332);QJsonDocument doc;doc.setObject(rootObject);QByteArray byteArray = doc.toJson(QJsonDocument::Compact);QString strPath = getExePath() + "/data.json";QFile file(strPath);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {qDebug()<<QStringLiteral("打开文件")<<strPath<<QStringLiteral("失败!");}QTextStream out(&file);out<<byteArray;file.close();
}void JsonGenrateParse::readJsonFile()
{QString strPath = getExePath() + "/data.json";QFile file(strPath);if (!file.open(QIODevice::ReadOnly)) {qDebug()<<QStringLiteral("打开文件")<<strPath<<QStringLiteral("失败!");}QByteArray byteArray = file.readAll();byteArray = QString::fromLocal8Bit(byteArray).toUtf8();//从本地编码转换为utf-8编码qDebug()<<"byteArray="<<byteArray.data();parseJsonFile(byteArray);
}void JsonGenrateParse::createQStringToJson()
{QString strSchool = QStringLiteral("海南");QString strAddr = QStringLiteral("胡说的");QJsonObject rootObject;rootObject.insert("school",strSchool);//从utf-8编码转换为本地编码rootObject.insert("address",strAddr);rootObject.insert("grade",1);rootObject.insert("number",13234);QJsonDocument doc;doc.setObject(rootObject);QByteArray byteArray = doc.toJson(QJsonDocument::Compact);QString strPath = getExePath() + "/datass.json";QFile file(strPath);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {qDebug()<<QStringLiteral("打开文件失败");}QTextStream out(&file);out<<byteArray;file.close();
}void JsonGenrateParse::readQStringToJson()
{QString strPath = getExePath() + "/datass.json";QFile file(strPath);if (!file.open(QIODevice::ReadOnly)) {qDebug()<<QStringLiteral("打开文件")<<strPath<<QStringLiteral("失败!");}QByteArray byteArray = file.readAll();byteArray = QString::fromLocal8Bit(byteArray).toUtf8();//从本地编码转换为utf-8编码qDebug()<<"byteArray="<<byteArray.data();parseJsonFile(byteArray);
}void JsonGenrateParse::parseJsonFile(QByteArray &byteArray)
{QJsonParseError parseError;QJsonDocument doc = QJsonDocument::fromJson(byteArray,&parseError);if (!doc.isEmpty() && parseError.error == QJsonParseError::NoError) {QJsonObject rootObject = doc.object();qDebug()<<QStringLiteral("school:")<<rootObject.value("school").toString();qDebug()<<QStringLiteral("address:")<<rootObject.value("address").toString();qDebug()<<QStringLiteral("grade:")<<rootObject.value("grade").toInt();qDebug()<<QStringLiteral("number:")<<rootObject.value("number").toInt();}else {qDebug()<<QStringLiteral("解析json失败!");}
}
上面写了两种创建含有中文的json文件的方式,其实质是一样的,但是有雨作者不是很能准确的掌握和理解编码格式,故而写了两种生成含有中文的json文件的方式,以备后面使用。