После моего комментария я предлагаю вам использовать библиотеку генерации кода для разбора JSON
до JSON Models
.
Чтение этой статьи , объясняющей, как использовать (например)пакет json_serializable .
Такие библиотеки выполняют всю грязную работу по генерации всего шаблонного кода для создания классов вашей модели, и они заботятся о значениях null
какобязательно или нет.
Например, если вы аннотируете класс Person следующим образом:
@JsonSerializable(nullable: true)
class Person {
final String firstName;
final String lastName;
final DateTime dateOfBirth;
Person({this.firstName, this.lastName, this.dateOfBirth});
factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
Map<String, dynamic> toJson() => _$PersonToJson(this);
}
с помощью (nullable: true
), в классе дротиков вашей модели поля пустых значений будут пропущены.
ОБНОВЛЕНИЕ
Поскольку я стремлюсь к технологии, я дал quicktype инструмент (предложенный Кристофом Лахенихтом) попробуйте на вашем примере.
Я подготовил mock api и файл example.json
, содержащий JSON, который вы опубликовали.Я взял только один элемент, а не массив.И вы можете посмотреть здесь example.json .
После установки в QuickType я сгенерировал класс модели для этого json:
quicktype --lang dart --all-properties-optional example.json -o example.dart
Обратите внимание, что здесьПараметр cli --all-properties-optional
, который создает нулевые проверки для пропущенных полей.
Map<String, dynamic> toJson() => {
"id": id == null ? null : id,
"date": date == null ? null : date,
"title": title == null ? null : title.toJson(),
"content": content == null ? null : content.toJson(),
"excerpt": excerpt == null ? null : excerpt.toJson(),
"author": author == null ? null : author,
"featured_media": featuredMedia == null ? null : featuredMedia,
"_links": links == null ? null : links.toJson(),
"_embedded": embedded == null ? null : embedded.toJson(),
};
Затем я использовал класс Example в example.dart
var jsonExampleResponse =
await http.get('https://www.shadowsheep.it/so/53962129/testjson.php');
print(jsonExampleResponse.body);
var exampleClass = exampleFromJson(jsonExampleResponse.body);
print(exampleClass.toJson());
И все прошло нормально.
NB Конечно, когда вы используете этот класс, вы должны проверить, если его поля пусты, прежде чем их использовать:
print(exampleClass.embedded?.wpFeaturedmedia?.toString());
Вот и все.Я надеюсь направить вас в правильном направлении.