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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:50:18