C++如何将含大量转义字符的变量值插入原始字符串并存入JSON
问题解答
1. C++原始字符串能否插入运行期变量
C++的原始字符串(Raw String Literal)属于编译期常量,仅用于代码编写阶段直接定义包含大量转义字符的字符串常量,不支持在运行阶段往其中插入动态变量的值。
2. 你的场景无需手动处理原始字符串
你使用的nlohmann/json库已经内置了符合JSON规范的字符串转义处理逻辑:直接将包含任意特殊字符、转义字符的std::string变量赋值给JSON对象的字段即可,库会自动完成转义,不需要你手动将变量转换为原始字符串格式。
3. 现有代码的优化建议
- 你代码中
j[firstObj] = one;写法存在问题:如果firstObj不是提前定义的字符串变量,需要加引号改为j["firstObj"] = one;,否则会触发编译错误。 - 读文件生成
stringa的逻辑可以简化,不需要循环逐个字符拼接:
std::ifstream conf(confPath, std::ios::binary); // 直接用迭代器范围构造string,无需中间vector和循环 std::string stringa((std::istreambuf_iterator<char>(conf)), std::istreambuf_iterator<char>()); j["conf"] = stringa;
4. 后续写入文件的实现方式
输出完整JSON到文件
直接调用JSON对象的dump方法即可,库会自动处理所有字段的转义,输出符合规范的JSON内容:
std::ofstream out_file("output.json"); // 第一个参数为缩进空格数,填-1会输出压缩格式的JSON out_file << j.dump(4); out_file.close();
单独提取原始字符串内容
如果需要单独取出conf字段的原始内容使用,直接调用get方法即可,库会自动还原转义,得到和原始stringa完全一致的内容:
std::string restored_conf = j["conf"].get<std::string>(); // 此时restored_conf和你读取文件得到的stringa内容完全相同,无多余转义
内容的提问来源于stack exchange,提问作者Matteo Barbieri
相关产品推荐
相关产品推荐

