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

时间:2019-01-02 12:23:41

标签: c++ arrays jsoncpp

我有以下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字符串解析为stringstream之后,我可以将购物车解析为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将购物车解析为数组?

1 个答案:

答案 0 :(得分:2)

解析外部JSON的方式相同!

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

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

因此,you can use 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文档。