【问题标题】:c++ JsonCpp parse string with escaped quotes as arrayc ++ JsonCpp将带有转义引号的字符串解析为数组
【发布时间】:2019-01-02 12:23:41
【问题描述】:

我有以下 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后,我可以将cart解析为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 将 cart 解析为数组?

【问题讨论】:

  • 你试过responseDataCart = responseData[0]["cart"]["name"];
  • 是的,我试过了 - 它不起作用。
  • 你的退货单很浪费。 toStyledString() 已经给了你一个std::string,只需要直接返回(它会移动它);您从中获取一个 C 字符串,然后从 that 构造一个新字符串。这不是世界末日,但它确实需要 strlen 调用并禁止移动数据。

标签: c++ arrays jsoncpp


【解决方案1】:

与解析外部 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 文档。

【讨论】:

  • 非常感谢您的回复!与 Json::CharReader* reader = jsonReader.newCharReader(); 完美配合
  • @MichaelK。不要忘记delete它!我喜欢使用std::unique_ptr 来完成任务。我在生产中遇到了内存泄漏auto reader = Json::CharReaderBuilder().newCharReader(); 并忘记了它返回一个裸指针:( 不用说代码区域现在有一个大量的注释警告在它上面拍打
猜你喜欢
  • 2013-01-10
  • 2015-10-27
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
相关资源
最近更新 更多