C++如何按特定位置的逗号分割JSON格式拼接字符串
问题:按特定分隔符分割JSON片段字符串
我从Web应用接收一个用于令牌化处理的字符串,该字符串是动态的,每次包含的子字符串数量不固定且结构略有差异。示例字符串为:
{"name":"Move","user":1,"robot":2,"map":1,"x":"4","y":"87"},{"name":"Wait","user":1,"robot":2,"map":1,"mins":"3"},{"name":"ReturnHome","user":1,"robot":2,"map":1,"RH":"yes"}
我希望按每个}后的逗号分割该字符串,得到3个独立子字符串并存入vector。但我对C++并不熟悉,目前尝试的方法会分割所有逗号。当前预处理代码如下:std::stringstream ss(msg->data.c_str()); std::stringstream ss_1; while (ss.good()) { std::string substr; getline(ss, substr, '['); v.push_back(substr); } for (std::size_t i = 0; i < v.size(); i++) { std::cout <<"\n This is after first iteration:"<< v[i] << std::endl; ss_1.str(v[i]); } while (ss_1.good()) { std::string substr; getline(ss_1, substr, ']'); u.push_back(substr); }虽然可以扩展当前代码,但会有很多边界情况需要处理,因此想询问是否有更优雅的实现方式。
方案1:手动遍历分割(无额外依赖)
核心逻辑是定位},这个特定分隔符,避免分割JSON内部的逗号,同时处理最后一个对象无结尾逗号的情况:
#include <vector> #include <string> std::vector<std::string> splitJsonObjects(const std::string& input) { std::vector<std::string> result; size_t start = 0; size_t pos = 0; // 循环查找所有"}, "分割点 while ((pos = input.find("},", start)) != std::string::npos) { // 截取从start到pos+1的部分(包含结尾的}) result.push_back(input.substr(start, pos - start + 1)); start = pos + 2; // 跳过当前的"}, " } // 处理最后一个没有结尾逗号的JSON对象 if (start < input.size()) { result.push_back(input.substr(start)); } return result; }
使用示例:
std::string input = R"({"name":"Move","user":1,"robot":2,"map":1,"x":"4","y":"87"},{"name":"Wait","user":1,"robot":2,"map":1,"mins":"3"},{"name":"ReturnHome","user":1,"robot":2,"map":1,"RH":"yes"})"; auto objects = splitJsonObjects(input); // 输出验证 for (const auto& obj : objects) { std::cout << obj << "\n---\n"; }
方案2:使用JSON库(更可靠,推荐)
你的输入本质是缺少首尾[]的JSON数组,用成熟的JSON库可以彻底规避手动分割的边界问题(比如字符串字段中包含},的极端情况)。这里推荐轻量的单头文件库nlohmann/json:
#include <vector> #include <string> #include "nlohmann/json.hpp" using json = nlohmann::json; std::vector<std::string> parseJsonObjects(const std::string& input) { std::vector<std::string> result; // 补全为合法的JSON数组格式 std::string json_str = "[" + input + "]"; json arr = json::parse(json_str); // 遍历每个JSON对象,转为标准JSON字符串存入vector for (const auto& obj : arr) { result.push_back(obj.dump()); } return result; }
优势说明
手动分割仅适用于简单场景,若JSON字符串字段中包含},(比如{"desc":"abc},def"}),会出现错误截断。而JSON库会正确识别字符串内部的特殊字符,完全避免这类问题。
内容的提问来源于stack exchange,提问作者Pran-7
相关产品推荐
相关产品推荐

