Как вызвать исключение при доступе к неверному ключу с карты в Dart - PullRequest
0 голосов
/ 06 февраля 2019

Я декодирую строку JSON, используя Dart / Flutter, и я хочу убедиться, что полученный Map имеет все ключи, которые я ожидаю.

    return MyRecord(
        id: jsonObj['id'],
        name: jsonObj['name'],
        description: jsonObj['description']
    );

Я думал, что получу исключение, если попытаюсь получить доступ к ключу, которого нет на карте, но вместо этого Дарт молча возвращает null.Я думаю, я мог бы просто использовать что-то вроде

    if( !(jsonObj.containsKey('id') 
       && jsonObj.containsKey('name') 
       && jsonObj.containsKey('description')) )
          throw new ArgumentError('Invalid JSON for converting to MyRecord: $jsonObj');

Но я надеюсь, что есть более удобный способ достичь того, чего я хочу?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

В зависимости от того, где вы хотите выполнить проверку, вы можете написать что-то вроде этого:

var requiredKeys = ['id', 'name', 'description'];
var isMissingKey = requiredKeys.any((requiredKey) => !jsonObj.containsKey(requiredKey);

Вы можете даже вызвать .any непосредственно на литерал List, чтобы сделать его одной строкой, есливы хотите.

Если вам нужно точно знать, какие ключи отсутствуют (возможно, для сообщения об ошибке), вы можете использовать это:

var missingKeys = requiredKeys.where((requiredKey) => !jsonObj.containsKey(requiredKey));
0 голосов
/ 07 февраля 2019

В дополнение к другим ответам я нашел другой способ сделать это.

return MyRecord(
    id: jsonObj['id'] ?? Null,
    name: jsonObj['name'] ?? Null,
    description: jsonObj['description'] ?? Null
);

Не уверен, что могут быть потенциальные побочные эффекты в зависимости от того, какие типы полей вы пытаетесь назначить, но до сих пор это работает для всего, что я пробовал.

Преимущество этого метода в том, что он менее многословен, чем

return MyRecord(
    id: jsonObj['id'] ?? (throw ArgumentError("id is required"),
    name: jsonObj['name'] ?? (throw ArgumentError("nameis required"),
    description: jsonObj['description'] ?? (throw ArgumentError("description is required")
);

, но исключение по-прежнему вызывается в фактическом коде назначения, что сводит к минимуму риск того, что вы забудете добавить / изменить имена полей вотдельный чек.

0 голосов
/ 06 февраля 2019

Еще не супер удобно, но есть возможность:

MyRecord(
  id: jsonObj['id'] ?? (throw ArgumentError("id is required"),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...