如何解析对null调用的映射值



我有一个使用映射的联系人模型,但返回为null,因此导致aysnc暂停。我曾尝试将这些地图设置为返回空列表,但没有成功解决问题。

ContactModel{
//factory method constructor 
emails: List<Email>.from(parsedJson['Emails'].map((x)=>Email.fromJson(x))),
tasks:  List<Tasks>.from(parsedJson["Tasks"].map((x) => Tasks.fromJson(x))),
notes: List<Notes>.from(parsedJson["Notes"].map((x) => Notes.fromJson(x))),
}

错误返回为:没有在null上调用这样的方法映射。接收器空

我试着把它写成来解决这个问题

ContactModel{
//factory method constructor 
emails: List<Email>.from(parsedJson['Emails'].map((x)=>Email.fromJson(x))).toList() ?? [],
tasks:  List<Tasks>.from(parsedJson["Tasks"].map((x) => Tasks.fromJson(x))).toList() ?? [],
notes: List<Notes>.from(parsedJson["Notes"].map((x) => Notes.fromJson(x))).toList() ?? [],
}

您可以尝试null检查json,如下所示:

ContactModel{
emails: parsedJson['Emails'] != null ? List<Email>.from(parsedJson['Emails'].map((x)=>Email.fromJson(x))).toList() : [],
tasks: parsedJson['Tasks'] != null ?  List<Tasks>.from(parsedJson["Tasks"].map((x) => Tasks.fromJson(x))).toList() : [],
notes:parsedJson['Notes'] != null ?  List<Notes>.from(parsedJson["Notes"].map((x) => Notes.fromJson(x))).toList() : [],
}

基本上,在处理JSON类型时,我总是检查两件事:

  • 您必须检查您的JSON是否包含您要查找的密钥
  • 如果键存在,则必须检查返回的null值

我建议你这样做双重检查:

if(parsedJson.isNotEmpty) {
List<dynamic> emails = [];
if (parsedJson.containsKey('Email') && parsedJson['Email'] is List) {
emails = List<Email>.from(parsedJson['Emails'].map((x)=>Email.fromJson(x)))
}
ContactModel({emails: emails});
}

通过这种方式,您总是确保您拥有正确的类型,并避免生产错误(想象一下您的API会疯掉(。我知道它更详细,但对我来说,好的代码需要准确的

最新更新