std.json — любой способ проверить, есть ли в JSONValue определенное поле.

Предположим, у меня есть неизвестный бит JSON, и я хочу проверить, имеет ли он форму, подобную этой:

{
    "foo": stuff
    "bar": stuff
}

где stuff — что угодно — целое число, объект, что угодно. Если я сделаю что-то вроде этого:

auto json = parseJSON("{}");
auto foo = json["foo"];

Я получу сегфолт. Есть ли способ изящно справиться с этим (вернуть ноль, выдать исключение, что-нибудь кроме segfault)?


person Koz Ross    schedule 18.11.2014    source источник


Ответы (1)


Просто используйте оператор D in, как с ассоциативным массивом D:

auto foo = "foo" in json ? json["foo"].str : null;

Если вы используете DMD 2.065 или более раннюю версию, вам нужно использовать json.object для оператора in:

auto foo = "foo" in json.object ? json["foo"].str : null;
person Vladimir Panteleev    schedule 18.11.2014
comment
Моему компилятору это не очень нравится - эта строка выдает ошибку rvalue of in expression must be an associative array, not JSONValue. - person Koz Ross; 18.11.2014
comment
Тогда попробуй "foo" in json.object. - person Vladimir Panteleev; 18.11.2014
comment
Это сработало, спасибо! Не могли бы вы отредактировать свой ответ, чтобы другие люди не повторяли мою ошибку, пожалуйста? - person Koz Ross; 18.11.2014
comment
Сделанный. json.object требуется только для DMD 2.065 или старше. - person Vladimir Panteleev; 18.11.2014