c ++ JsonCpp разбирает строку с экранированными кавычками в виде массива - PullRequest
0 голосов
/ 02 января 2019

У меня есть следующая строка 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"
}

Я могу разобрать cart как std :: string после анализа входной строки json как stringstream:

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 голосов
/ 02 января 2019

Так же, как вы анализировали внешний 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 сам по себе.

...