C++中如何在原始JSON字符串中使用变量?
在C++中构建带变量的JSON字符串的正确方法
你之前的错误在于,R"(variable)"只是创建了一个内容为"variable"的字符串,这不是有效的JSON,所以解析时必然失败。要将变量值插入JSON,有以下几种可靠方法:
方法1:字符串拼接(简单场景)
直接将JSON模板与变量值拼接,适合变量内容可控、无特殊字符的情况:
#include "json/json.h" #include <iostream> #include <memory> #include <string> int main() { // 定义要插入的变量 int pid = 14112; int size = 172; std::string daddr = "239.255.255.250"; std::string saddr = "192.168.1.64"; int dport = 1900; int sport = 49807; // 拼接生成JSON字符串 const std::string rawJson = "{\"PID\":" + std::to_string(pid) + ",\"size\":" + std::to_string(size) + ",\"daddr\":\"" + daddr + "\",\"saddr\":\"" + saddr + "\",\"dport\":" + std::to_string(dport) + ",\"sport\":" + std::to_string(sport) + "}"; const auto rawJsonLength = static_cast<int>(rawJson.length()); constexpr bool shouldUseOldWay = false; JSONCPP_STRING err; Json::Value root; if (shouldUseOldWay) { Json::Reader reader; reader.parse(rawJson, root); } else { Json::CharReaderBuilder builder; const std::unique_ptr<Json::CharReader> reader(builder.newCharReader()); if (!reader->parse(rawJson.c_str(), rawJson.c_str() + rawJsonLength, &root, &err)) { std::cout << "error: " << err << std::endl; return EXIT_FAILURE; } } const std::string pidStr = root["PID"].asString(); const int sizeVal = root["size"].asInt(); std::cout << pidStr << std::endl; std::cout << sizeVal << std::endl; return EXIT_SUCCESS; }
方法2:用JsonCpp API直接构建JSON对象(推荐)
这是最安全的方式,JsonCpp会自动处理类型转换、特殊字符转义,避免手动拼接的错误:
#include "json/json.h" #include <iostream> #include <memory> int main() { // 定义变量 int pid = 14112; int size = 172; std::string daddr = "239.255.255.250"; std::string saddr = "192.168.1.64"; int dport = 1900; int sport = 49807; // 直接构建Json::Value对象 Json::Value root; root["PID"] = pid; root["size"] = size; root["daddr"] = daddr; root["saddr"] = saddr; root["dport"] = dport; root["sport"] = sport; // 若需要将对象转为字符串,使用StreamWriter Json::StreamWriterBuilder builder; const std::string rawJson = Json::writeString(builder, root); std::cout << "生成的JSON字符串: " << rawJson << std::endl; // 直接使用root对象即可,无需再次解析 const std::string pidStr = root["PID"].asString(); const int sizeVal = root["size"].asInt(); std::cout << pidStr << std::endl; std::cout << sizeVal << std::endl; return EXIT_SUCCESS; }
方法3:C++20+ 使用std::format格式化字符串
如果你的编译器支持C++20,std::format能让JSON模板更易读:
#include "json/json.h" #include <iostream> #include <memory> #include <format> int main() { int pid = 14112; int size = 172; std::string daddr = "239.255.255.250"; std::string saddr = "192.168.1.64"; int dport = 1900; int sport = 49807; // 用std::format构建JSON,注意双花括号{{}}表示输出单个花括号 const std::string rawJson = std::format(R"( {{ "PID": {}, "size": {}, "daddr": "{}", "saddr": "{}", "dport": {}, "sport": {} }} )", pid, size, daddr, saddr, dport, sport); const auto rawJsonLength = static_cast<int>(rawJson.length()); constexpr bool shouldUseOldWay = false; JSONCPP_STRING err; Json::Value root; if (shouldUseOldWay) { Json::Reader reader; reader.parse(rawJson, root); } else { Json::CharReaderBuilder builder; const std::unique_ptr<Json::CharReader> reader(builder.newCharReader()); if (!reader->parse(rawJson.c_str(), rawJson.c_str() + rawJsonLength, &root, &err)) { std::cout << "error: " << err << std::endl; return EXIT_FAILURE; } } const std::string pidStr = root["PID"].asString(); const int sizeVal = root["size"].asInt(); std::cout << pidStr << std::endl; std::cout << sizeVal << std::endl; return EXIT_SUCCESS; }
方法对比
- 字符串拼接:实现简单,但容易因特殊字符(如双引号)导致JSON格式错误,仅适合简单场景。
- JsonCpp API构建:安全可靠,自动处理所有格式问题,是生产环境的首选。
- std::format:语法清晰易读,但依赖C++20及以上版本。
内容的提问来源于stack exchange,提问作者robkims
相关产品推荐
相关产品推荐

