如何在Dart的fromJson中适配多套键名以共用影视数据Model类
错误原因分析
- 第一种条件判断写法的核心问题是判断逻辑错误:
json["title"] == Null是将字段值和Null类型本身做比较,该判断永远返回false。当解析电视节目数据时,JSON中不存在title字段,会直接取json["title"]的null值,又因为没有做安全的类型转换,dynamic类型的null直接赋值给String?类型就会触发类型不匹配异常。 - 第二种空合并写法失效的原因同样是缺少类型转换:从Map中取出的dynamic类型值没有做类型约束,就算值本身是可空的String,直接赋值也可能触发类型检查报错。
正确实现方案
方案1:简易适配(适合差异字段较少的场景)
对取出的字段值先做安全的类型转换,再用空合并运算符取值即可:
factory Result.fromJson(Map<String, dynamic> json) => Result( // 先转成可空String,再走空合并逻辑 title: (json["title"] as String?) ?? (json["name"] as String?), // 其他字段同理,比如电影的上映日期是release_date,节目是first_air_date就可以写: releaseDate: (json["release_date"] as String?) ?? (json["first_air_date"] as String?), );
如果需要兜底默认值,可以在末尾再加一层空合并:
title: (json["title"] as String?) ?? (json["name"] as String?) ?? "未知标题",
方案2:封装通用工具方法(适合差异字段较多的场景)
如果有多个字段需要做多键适配,可以封装一个通用的取值方法,避免重复写冗余逻辑:
// 通用多键取值工具,按顺序从传入的key列表中匹配第一个类型符合的值 T? getValueByKeys<T>(Map<String, dynamic> json, List<String> keys) { for (final key in keys) { final value = json[key]; if (value is T) return value; } return null; } // fromJson中直接调用即可 factory Result.fromJson(Map<String, dynamic> json) => Result( title: getValueByKeys<String>(json, ["title", "name"]), releaseDate: getValueByKeys<String>(json, ["release_date", "first_air_date"]), voteCount: getValueByKeys<int>(json, ["vote_count", "rating_count"]), );
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

