但是我这里面除了有一个message作为json的Member,还需要输入多个kv键值对,请修改这个宏定义
时间: 2024-03-05 20:49:27 浏览: 59
动手写一个angular版本的Message组件的方法
好的,请看下面的代码:
```
#define JSONLOG(...) { \
rapidjson::Document doc; \
doc.SetObject(); \
auto allocator = doc.GetAllocator(); \
doc.AddMember("filename", __FILE__, allocator); \
rapidjson::Value message(rapidjson::kObjectType); \
int i = 0; \
for (auto arg = #__VA_ARGS__; *arg; ++arg) { \
if (*arg == ',' || *arg == ')') { \
std::string str = std::string(#__VA_ARGS__).substr(i, arg - #__VA_ARGS__ - i); \
i = arg - #__VA_ARGS__; \
auto pos = str.find('='); \
if (pos != std::string::npos) { \
std::string key = str.substr(0, pos); \
std::string value = str.substr(pos + 1); \
rapidjson::Value k(key.c_str(), allocator); \
rapidjson::Value v(value.c_str(), allocator); \
message.AddMember(k, v, allocator); \
} \
} \
} \
doc.AddMember("message", message, allocator); \
rapidjson::StringBuffer jsonbuffer; \
rapidjson::Writer<rapidjson::StringBuffer> writer(jsonbuffer); \
doc.Accept(writer); \
std::cout << jsonbuffer.GetString() << std::endl; \
}
```
使用时,可以像这样调用:
```
JSONLOG(key1=value1, key2=value2, key3=value3);
```
该宏定义将传入的多个键值对转化为 JSON 格式,并输出到控制台。其中,"filename" 字段记录了当前文件名,"message" 字段则记录了传入的键值对。
阅读全文