You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:09:10