使用rapidjson构建生成复杂的json串

本文介绍了如何使用RapidJSON库生成复杂的JSON字符串,以解决硬编码JSON导致的繁琐和可读性差的问题。在实践中遇到将类型转换为JSON的问题,通过查阅文档和尝试,找到了将类型转化为字符串指针的方法,最终成功构建了所需的JSON数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做项目有个环节是生成一个json串作为请求,json串的大概格式如下:

{  
   "id":"000001",
   "name":"Tom",
   "urls": {  
	   "success_url":"http://www.success_url.com",
       "cannel_url":"http://www.cannel_url.com"
   },
   "info": {  
       "desc":"description",
       "date":"2017-07-16",
       "price":{  
             "amount":8.8,
             "currency":"CNY"
        }
      }
}

考虑到这样的json串进行硬编码会很繁琐,而且可读性差,所以打算使用rapidjson这个开源的库来构建我的json串。

先是参考了这篇博文http://blog.youkuaiyun.com/a2651257380/article/details/50536660,知道了大概的构建过程,但是发现有个问题,就是我的json数据是从一个const map中获取的,所以value是const string类型,但是rapidjson中没有AddMember函数中能适配const string类型,然后我尝试了使用string::c_str()来将string转化为指针,也是不行,但是字符串常量却可以,这让我很不解,因为我去翻阅文档,发现了一个函数StringRef,文档的解释是“对于字符指针,RapidJSON 需要作一个标记,代表它不复制也是安全的。以使用StringRef函数。”因此得以构建,最终代码如下:

包含头文件

#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <rapidjson/stringbuffer.h>

构建json串

rapidjson::Document document;
document.SetObject();
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
	
rapidjson::Value url_objects(rapidjson::kObjectType);
rapidjson::Value price_objects(rapidjson::kObjectType);
rapidjson::Value info_objects(rapidjson::kObjectType);
        
document.AddMember("id", rapidjson::StringRef(data_in["id"].c_str()), allocator);
document.AddMember("name", rapidjson::StringRef(data_in["name"].c_str()), allocator);
	
url_objects.AddMember("success_url", rapidjson::StringRef(data_in["success_url"].c_str()), allocator);
url_objects.AddMember("cannel_url", rapidjson::StringRef(data_in["cannel_url"].c_str()), allocator);
document.AddMember("urls", url_objects, allocator);

price_objects.AddMember("amount", atof(data_in["amount"].c_str()), allocator);
price_objects.AddMember("currency", rapidjson::StringRef(data_in["currency"].c_str()), allocator);

info_objects.AddMember("desc", rapidjson::StringRef(data_in["desc"].c_str()), allocator);
info_objects.AddMember("date", rapidjson::StringRef(data_in["date"].c_str()), allocator);
info_objects.AddMember("price", price_objects, allocator);

document.AddMember("info", info_objects, allocator);
	
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
const std::string json = buffer.GetString();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值