c++ JsonCpp 解析带有转义引号作为数组的字符串

c++ JsonCpp parse string with escaped quotes as array

本文关键字:数组 字符串 转义 JsonCpp c++      更新时间:2023-10-16

我有以下json字符串:

{
    "data" : 
    [
        {
            "cart" : "[{"name":"Test item 1","price":15,"quantity":1,"sum":15,"tax":"none","payment_type":"advance","item_type":"service"},{"name":"Test item 2","price":13.01,"quantity":2,"sum":26.02,"tax":"none","payment_type":"part_prepay","item_type":"work"}]",
            "contact" : "noname@google.com",
            "p_id" : "603",
            "sum" : "100.02",
            "tax_system" : "osn"
        }
    ],
    "msg" : null,
    "result" : "success"
}

在将输入 json 字符串解析为字符串流后,我可以将购物车解析为 std::string:

const std::string ParseJsonData(std::stringstream ssJsonStream)
{
    Json::Value jsonData;
    Json::Value responseData;
    Json::Value responseDataCart;
    Json::CharReaderBuilder jsonReader;
    std::string errs;
    if (Json::parseFromStream(jsonReader, ssJsonStream, &jsonData, &errs)) {
        responseData = jsonData["data"];
        responseDataCart = responseData[0]["cart"];
        return responseDataCart.toStyledString().c_str();
    }
    else
        return "Could not parse HTTP data as JSON";
}

请告诉我,如何使用 JsonCpp 将购物车解析为数组?

解析

外部 JSON 的方式相同!

您从一个字符串(好吧,被流隐藏)开始,并将其转换为 JSON。

现在,JSON 包含一个字符串属性,并且本身包含 JSON。问题是递归的。内部字符串最初来自 JSON 的事实也可以忽略。只是假装它是你输入的字符串。

因此,您可以使用 JSON::Reader 依次从该字符串中获取 JSON。

像这样:

const std::string responseDataCartStr = responseData[0]["cart"].asString();
Json::Reader reader;
if (!reader.parse(responseDataCartStr, responseDataCart))
   throw std::runtime_error("Parsing nested JSON failed");

JsonCpp 提供了几种解析 JSON 的方法,值得探索它们以找到最适合您的用例的方法。以上只是一个例子。

忽略反斜杠 — 转义在封装 JSON 文档中是有意义的,但最外层的解析阶段应该已经考虑到了这一点。如果将responseDataCartStr打印到控制台,您将看到它本身就是一个有效的 JSON 文档。