RapidJSON 是一个 C++ 的 JSON 解析器及生成器。它的灵感来自 RapidXml。
RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。
http://rapidjson.org/zh-cn/官网
使用代码如下:实现Document转出到QVariantMap
#include <QtCore/QCoreApplication>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
#include "handlerapidjson.h"
#include <QMap>
#include <QByteArray>
#include <QVariantMap>
using namespace rapidjson;
QString getString(rapidjson::Document &doc, QString key)
{
QString str = "";
if (doc.HasMember(key.toLocal8Bit().data()) && doc[key.toLocal8Bit().data()].IsString())
{
str = QString::fromLocal8Bit(doc[key.toLocal8Bit().data()].GetString());
}
return str;
}
QString getStringFromObj(rapidjson::Value& obj, QString key)
{
QString str = "";
if (obj.HasMember(key.toLocal8Bit().data()) && obj[key.toLocal8Bit().data()].IsString())
{
str = QString::fromLocal8Bit(obj[key.toLocal8Bit().data()].GetString());
}
return str;
}
QString valueToString(const rapidjson::Value &objValue)
{
QString rstr;
if (objValue.IsString())
{
rstr = QString(objValue.GetString());
}
else if (objValue.IsInt())
{
rstr = QString("%1").arg(objValue.GetInt());
}
else if (objValue.IsDouble())
{
rstr = QString("%1").arg(objValue.GetDouble());
}
else if (objValue.IsBool())
{
rstr = QString("%1").arg(objValue.GetBool());
}
else if (objValue.IsNumber())
{
rstr = QString("%1").arg(objValue.GetInt64());
}
else if (objValue.IsInt64())
{
rstr = QString("%1").arg(objValue.GetInt64());
}
return rstr;
}
QVariantMap pareDoc(rapidjson::Document &document)
{
//暂时只支持一层
QVariantMap rmap;
for (rapidjson::Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd(); ++itr)
{
const rapidjson::Value& objKey = itr->name;
const rapidjson::Value& objValue = itr->value;
QString key = QString(objKey.GetString());
QString valuestr;
if (objValue.IsObject())
{
QVariantMap objmap;
for (rapidjson::Value::ConstMemberIterator objIt = itr->value.MemberBegin(); objIt != itr->value.MemberEnd(); ++objIt)
{
const rapidjson::Value& childobjKey = objIt->name;
const rapidjson::Value& childobjValue = objIt->value;
QString childkey = QString(childobjKey.GetString());
QString childvaluestr = valueToString(childobjValue);
objmap.insert(childkey, childvaluestr);
}
rmap.insert(key,objmap);
}
else if (objValue.IsArray())
{
QVariantList tmplist;
for (rapidjson::SizeType i = 0; i < objValue.Size(); ++i)
{
const rapidjson::Value& element = objValue[i];
if (element.IsObject())
{
//解析对象
QVariantMap objmap;
for (rapidjson::Value::ConstMemberIterator objIt = element.MemberBegin(); objIt != element.MemberEnd(); ++objIt)
{
const rapidjson::Value& childobjKey = objIt->name;
const rapidjson::Value& childobjValue = objIt->value;
QString childkey = QString(childobjKey.GetString());
QString childvaluestr = valueToString(childobjValue);
objmap.insert(childkey, childvaluestr);
}
tmplist << objmap;
}
else
{
//解析数组
valuestr = valueToString(element);
tmplist << valuestr;
}
}
rmap.insert(key,tmplist);
}
else
{
valuestr = valueToString(objValue);
rmap.insert(key,valuestr);
}
}
return rmap;
}
void writeTest()
{
rapidjson::Document document;
document.SetArray();
QString sss = "sss";
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
// 创建一个JSON对象并添加到数组中
rapidjson::Value obj1(rapidjson::kObjectType);
obj1.AddMember(rapidjson::Value().SetString(sss.toLocal8Bit().data(),allocator), rapidjson::Value().SetString(sss.toLocal8Bit().data(),allocator), allocator);
obj1.AddMember("age", 30, allocator);
document.PushBack(obj1, allocator);
// 创建另一个JSON对象并添加到数组中
rapidjson::Value obj2(rapidjson::kObjectType);
obj2.AddMember("name", "Doe", allocator);
obj2.AddMember("age", 25, allocator);
//document.PushBack(obj2, allocator);
rapidjson::Value obj3(rapidjson::kArrayType);
obj3.PushBack(obj2, allocator);
document.SetObject();
document.AddMember("keyid", obj3, allocator);
// 将JSON数组转换为字符串
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
std::cout << buffer.GetString() << std::endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const char* json = "{\"project\":\"rapidjson\",\"stars\":10, \"obj\": {\"a\":\"1\",\"c\":1720243638463},\"list\":[1,2,3,4], \"listobj\":[{\"a\":\"1\",\"c\":1720243638463}]}";
Document d;
d.Parse(json);
QVariantMap rmap = pareDoc(d);
return 1;
}