Как решить исключение, сгенерированное из-за преобразования строки в json? - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь понять преобразование JSON в строку и преобразование строки в JSON, используя инфраструктуру nlohmann для библиотеки JSON в C ++.Однако у меня возникает проблема с сгенерированным исключением, и я не понимаю причину, по которой оно генерируется.

Ниже приведен код, который я использовал из среды nlohmann.Я попытался создать объект JSON "j_string", добавить атрибут "translation_matrix" и добавить к нему соответствующее значение типа string из предопределенной переменной "greetings".Теперь я пытаюсь преобразовать строку в JSON, затем проанализировать ее и снова преобразовать в строку.По сути, я пытаюсь отправить эти данные через UDP, что является полной идеей моего проекта.Для этого мне нужно преобразовать строку в JSON, выполнить некоторые вычисления, чтобы извлечь определенное значение атрибута, а затем преобразовать его обратно в строку и отправить через UDP.Когда я пытаюсь преобразовать строку в JSON, я получаю исключение от компилятора.Я использую Visual Studio 2019. Сгенерировано следующее исключение:

"Необработанное исключение в 0x772718A2 в jsoncpp2.exe: исключение Microsoft C ++: nlohmann :: detail :: type_error в расположении памяти 0x00E9F504."

Дайте мне знать, почему генерируется такое исключение.Когда я компилирую код, он говорит, что нет ошибки.Однако, когда я выполняю это, я получаю исключение.Я добавил необходимые файлы и заголовки.

#include<iostream>
#include<sstream>
#include<nlohmann/json.hpp>

using json = nlohmann::json;

int main() {
    std::string greetings = "greetings from string";
    json j_string;
    j_string["transformation matrix"] = greetings;

    auto cpp_string = j_string.get<std::string>();

    std::string serialized_string = j_string.dump();

    std::cout << serialized_string << '\n';
}

Мой ожидаемый результат:

[
"transfornation matrix" : "greetings from string"
]

1 Ответ

0 голосов
/ 03 мая 2019

В целях общей безопасности вы должны убедиться, что j_string.is_string() перед тем, как позвонить j_string.get<std::string>(), чтобы избежать таких исключений.

Также обратите внимание, что, поскольку вы только что использовали присвоение стиля объекта с j_string["transformation matrix"] = greetings;, j_string становится типом object . Если бы вы вместо этого присвоили строку j_string напрямую, она взяла бы вместо нее string type.

Это описано в первых двух строках примеров nlohmann / json .

// create an empty structure (null)
json j;

// add a number that is stored as double (note the implicit conversion of j to an object)
j["pi"] = 3.141;
...