C++ rapidjson 使用

转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); 即可。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星点点-

请我喝杯咖啡呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值