Разве .value («ключ», по умолчанию) не работает с пустыми json объектами? - PullRequest
0 голосов
/ 16 января 2020

Я столкнулся с небольшим затруднением, используя функцию value в библиотеке nlohmann/json. У меня есть пустой json объект, и я хочу либо инициализировать его, либо увеличить его, если инициализированы вложенные ключи. Я пытался решить эту проблему с помощью функции значения, но продолжаю сталкиваться с ошибкой:

C++ exception with description "[json.exception.type_error.306] cannot use value() with null" thrown in the test body.

Итак, это просто не сработает?

nlohmann::json json;
std::string i = "1", j = "2", k = "3";
int old_value = json.value(i, nlohmann::json())
                    .value(j, nlohmann::json())
                    .value(k, 0);
json[i][j][k] = old_value + 1;

Edit: для тех, кто хочет лучший способ сделать такие вещи, я нашел лучший способ.

try {
    json[i][j][k].get_ref<nlohmann::json::number_integer_t &>()++;
} catch (nlohmann::json::type_error & ex) {
    json[i][j][k] = 1;
}

1 Ответ

2 голосов
/ 16 января 2020

Он не работает для необъектных json значений, и конструктор по умолчанию представляет null, а не {}.

Из их документации для value():

Исключения

  • type_error.306, если значение JSON не является объектом; в этом случае использование значения () с ключом не имеет смысла.

Вам придется инициализировать каждый из них с помощью nlohmann::json(json::value_t::object) или чем-то еще, чтобы инициализировать его пустым объект .

...