#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QVariantMap>
#include <QVariantList>
class JsonHelper
{
public:
static QString generateJson(const QVariantMap& data)
{
QJsonObject jsonObject = jsonObjectFromVariantMap(data);
QJsonDocument jsonDoc(jsonObject);
return jsonDoc.toJson(QJsonDocument::Compact);
}
static QVariantMap parseJson(const QString& jsonString)
{
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
if (!jsonDoc.isNull())
{
QJsonValue rootValue = jsonDoc.object();
if (rootValue.isObject())
{
return variantMapFromJsonObject(rootValue.toObject());
}
else if (rootValue.isArray())
{
QVariantMap map;
map["array"] = variantListFromJsonArray(rootValue.toArray());
return map;
}
}
return QVariantMap();
}
private:
static QJsonObject jsonObjectFromVariantMap(const QVariantMap& variantMap)
{
QJsonObject jsonObject;
for (const QString& key : variantMap.keys())
{
const QVariant& variant = variantMap.value(key);
switch (variant.type())
{
case QVariant::Map:
jsonObject[key] = jsonObjectFromVariantMap(variant.toMap());
break;
case QVariant::List:
jsonObject[key] = jsonArrayFromVariantList(variant.toList());
break;
case QVariant::String:
jsonObject[key] = variant.toString();
break;
case QVariant::Int:
case QVariant::Double:
jsonObject[key] = variant.toDouble();
break;
case QVariant::Bool:
jsonObject[key] = variant.toBool();
break;
default:
break;
}
}
return jsonObject;
}
static QJsonArray jsonArrayFromVariantList(const QVariantList& variantList)
{
QJsonArray jsonArray;
for (const QVariant& variant : variantList)
{
switch (variant.type())
{
case QVariant::Map:
jsonArray.append(jsonObjectFromVariantMap(variant.toMap()));
break;
case QVariant::List:
jsonArray.append(jsonArrayFromVariantList(variant.toList()));
break;
case QVariant::String:
jsonArray.append(variant.toString());
break;
case QVariant::Int:
case QVariant::Double:
jsonArray.append(variant.toDouble());
break;
case QVariant::Bool:
jsonArray.append(variant.toBool());
break;
default:
break;
}
}
return jsonArray;
}
static QVariantMap variantMapFromJsonObject(const QJsonObject& jsonObject)
{
QVariantMap variantMap;
for (const QString& key : jsonObject.keys())
{
const QJsonValue& jsonValue = jsonObject.value(key);
if (jsonValue.isObject())
{
variantMap[key] = variantMapFromJsonObject(jsonValue.toObject());
}
else if (jsonValue.isArray())
{
variantMap[key] = variantListFromJsonArray(jsonValue.toArray());
}
else if (jsonValue.isString())
{
variantMap[key] = jsonValue.toString();
}
else if (jsonValue.isDouble())
{
variantMap[key] = jsonValue.toDouble();
}
else if (jsonValue.isBool())
{
variantMap[key] = jsonValue.toBool();
}
}
return variantMap;
}
static QVariantList variantListFromJsonArray(const QJsonArray& jsonArray)
{
QVariantList variantList;
for (const QJsonValue& jsonValue : jsonArray)
{
if (jsonValue.isObject())
{
variantList.append(variantMapFromJsonObject(jsonValue.toObject()));
}
else if (jsonValue.isArray())
{
variantList.append(variantListFromJsonArray(jsonValue.toArray()));
}
else if (jsonValue.isString())
{
variantList.append(jsonValue.toString());
}
else if (jsonValue.isDouble())
{
variantList.append(jsonValue.toDouble());
}
else if (jsonValue.isBool())
{
variantList.append(jsonValue.toBool());
}
}
return variantList;
}
};
现在JsonHelper类具备了生成和解析JSON的功能。你可以使用generateJson方法来将QVariantMap转换为JSON字符串,使用parseJson方法将JSON字符串解析为QVariantMap。
下面是使用示例:
QVariantMap data;
data["name"] = "John Doe";
data["age"] = 30;
data["isStudent"] = true;
QVariantList hobbies;
hobbies.append("reading");
hobbies.append("gaming");
hobbies.append("coding");
data["hobbies"] = hobbies;
// 生成JSON数据
QString jsonString = JsonHelper::generateJson(data);
// 解析JSON数据
QVariantMap parsedJson = JsonHelper::parseJson(jsonString);
// 读取解析后的数据
QString name = parsedJson["name"].toString();
int age = parsedJson["age"].toInt();
bool isStudent = parsedJson["isStudent"].toBool();
QVariantList parsedHobbies = parsedJson["hobbies"].toList();