转JSON
rapidjson::Document document;
document.SetObject();
// 添加name, value
const char* name = "success_url";
const char* value = "https://www.google.com";
document.AddMember(rapidjson::StringRef(name), rapidjson::StringRef(value), document.GetAllocator());
// 添加json object
rapidjson::Value info_objects(rapidjson::kObjectType);
std::string jsonObject = "json_object";
info_objects.AddMember(rapidjson::StringRef("class_room"), rapidjson::StringRef("NO. 6110"), document.GetAllocator());
info_objects.AddMember(rapidjson::StringRef("teacher_name"), rapidjson::StringRef("ZhangSanfeng"), document.GetAllocator());
document.AddMember(rapidjson::StringRef(jsonObject.c_str()), info_objects, document.GetAllocator());
// 添加json array
rapidjson::Value array_objects(rapidjson::kArrayType);
for (int i = 0; i < 2; i++)
{
Value object(kObjectType);
Value nobject(kNumberType);
nobject.SetInt(i);
object.AddMember(StringRef("id"), nobject, document.GetAllocator());
object.AddMember(StringRef("name"), StringRef("zhangsan"), document.GetAllocator());
array_objects.PushBack(object, document.GetAllocator());
}
char * jsonArrayName = "jsonArrayName";
document.AddMember(rapidjson::StringRef(jsonArrayName), array_objects, document.GetAllocator());
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
std::string json = std::string(buffer.GetString());
LOGD("testAddMember = %s", json.c_str());
用法One: 简单修改json字符串
// 1. 把 JSON 解析至 DOM。
const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
Document d;
d.Parse(json);
// 2. 利用 DOM 作出修改。
Value& s = d["stars"];
s.SetInt(s.GetInt() + 1);
// 3. 把 DOM 转换(stringify)成 JSON。
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
// Output {"project":"rapidjson","stars":11}
std::cout << buffer.GetString() << std::endl;
用法Two: 构造简单json
StringBuffer s;
Writer<StringBuffer> writer(s);
writer.StartObject(); // Between StartObject()/EndObject(),
writer.Key("hello"); // output a key,
writer.String("world"); // follow by a value.
writer.Key("t");
writer.Bool(true);
writer.Key("f");
writer.Bool(false);
writer.Key("n");
writer.Null();
writer.Key("i");
writer.Uint(123);
writer.Key("pi");
writer.Double(3.1416);
writer.Key("a");
writer.StartArray(); // Between StartArray()/EndArray(),
for (unsigned i = 0; i < 4; i++)
writer.Uint(i); // all values are elements of the array.
writer.EndArray();
writer.EndObject();
// {"hello":"world","t":true,"f":false,"n":null,"i":123,"pi":3.1416,"a":[0,1,2,3]}
std::cout << s.GetString() << std::endl;
原文链接:https://blog.csdn.net/u014449046/article/details/79070301
解析复杂数据
{
"retType": 0,
"s2c": {
"basicQotList": [
{
"security": {
"market": 1,
"code": "HSI2004"
},
"isSuspended": false
}
}
]
}
}
获取basicQotList数组里面的security字段的market值
rapidjson::Document doc;
doc.Parse(value.data());
if (!doc.HasParseError())
{
if (doc.HasMember("retType") && doc["retType"].IsInt())
{
if (doc["retType"].GetInt() == 0)
{
if (doc.HasMember("s2c") && doc["s2c"].IsObject())
{
rapidjson::Value& s2c_object = doc["s2c"];
if (s2c_object.HasMember("basicQotList") && s2c_object["basicQotList"].IsArray())
{
auto rsp_ = s2c_object["basicQotList"].GetArray();
for (size_t i = 0; i < rsp_.Size(); i++) // 遍历列表行情数据
{
rapidjson::Value& v = rsp_[i];
// 转换市场编号信息
std::string key_ = "";
if (v.HasMember("security") && v["security"].IsObject())
{
int market_ = v["security"]["market"].GetInt();
std::string code_ = v["security"]["code"].GetString();
std::string market_str = getMarketStr(market_);
if (market_str == "Unknown")
{
LG_ERROR("Unknown market."<< market_);
continue;
}
key_ = market_str + "." + code_;
}
}
...
}
}
}
}
}
获取字段是对象的字符串值
{
"account":"www",
"data":{"message":"123","erorcode":0}
}
获取data字段的字符串值:"{"message":"123","erorcode":0}"
rapidjson::Document doc;
doc.Parse(json.data());
if (!doc.HasParseError()) {
if (doc.HasMember("Data") && doc["Data"].IsObject())
{
rapidjson::StringBuffer sb;
rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
doc["Data"].Accept(writer);
std::string Data_ = sb.GetString();
}
}
注意:
有一个小坑是在用 AddMember方法添加成员时。可以发现AddMember有7个重载类型。
GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator)
而第一个参数name,只有两种:StringRefType和GenericValue< Encoding, Allocator >
官方文档对于StringRefType的解释是:Reference to a constant string (引用的常量字符串)
所以若通过要传递的key是用户键入的变量,需要转成Value类型
即:
Value robot_key(YD_Robot.toStdString().c_str(), allocator); //传递key变量
docPtr.AddMember(robot_key, docCamera, allocator);
若传递固定的常量:
docPtr.AddMember(“xiaoming”, docCamera, allocator); 即可。