Dart:如果JSON不符合对象定义,则返回null值

时间:2019-06-28 03:52:45

标签: flutter dart

假设我有一个定义如下的数据模型:

class GymInfo {
  final String openDate;
  final String phoneNumber;
  final String state;
  final String clubRegion;
  final String email;
  final int hasKeypad;
  final int isPlatinum;
  final String linkClub;
  final int id;
  final int is24Hour;
  final String fullname;
  final String type;

  GymInfo({this.openDate, this.phoneNumber, this.state, this.clubRegion, this.email, this.hasKeypad, this.isPlatinum, this.linkClub, @required this.id, this.is24Hour, @required  this.fullname, this.type,});

  factory GymInfo.fromJson(Map<String, dynamic> json) {

    return GymInfo(
    openDate: json['openDate'], 
    phoneNumber: json["PhoneNumber"],
    state: json["state"],
    clubRegion: json["ClubRegion"],
    email: json['Email'],
    hasKeypad: json['hasKeypad'],
    isPlatinum: json['isPlatinum'],
    linkClub: json['link_club'],
    id: json['id'],
    is24Hour: json['is24Hour'],
    fullname: json['fullname'],
    type: json['type']);
  }
}

每当我将JSON映射传递给工厂时,如果该映射没有必需参数的值,我都希望它返回null。目前,它返回的GymInfo实例的所有参数都设置为null,这会给测试带来麻烦。如何确保初始化程序失败并返回null。

2 个答案:

答案 0 :(得分:2)

只需添加一个简单的验证即可确保您的必填字段不为空。

  factory GymInfo.fromJson(Map<String, dynamic> json) {

    final fullnameValue = json['fullname'];
    final idValue = json['id'];

    if (fullNameValue == null || idValue == null){
      return null;
    }

    return GymInfo(
    openDate: json['openDate'], 
    phoneNumber: json["PhoneNumber"],
    state: json["state"],
    clubRegion: json["ClubRegion"],
    email: json['Email'],
    hasKeypad: json['hasKeypad'],
    isPlatinum: json['isPlatinum'],
    linkClub: json['link_club'],
    id: idValue,
    is24Hour: json['is24Hour'],
    fullname: fullnameValue,
    type: json['type']);
  }

答案 1 :(得分:1)

这比您想像的要容易得多。
JSON格式是没有任何逻辑的格式。这意味着您应该可以随时更改JSON对象的实现,而不会产生影响。
在这种情况下,在您自己的服务对象中实现所需的逻辑会更正确。

MyJsonObject getMyObject(Object source) {
  // ...
  var myObject = MyJsonObject.fromJson(json);
  if (myObject.someField == null) {
    return null;
  }

  return myObject;
}```