Flutter API JSON解析为Dart类时如何处理空image对象避免类型错误
解决方案
这个报错的核心原因是你当前模型类中image字段被定义为不可空的Image类型,且解析时没有对json['image']为null的情况做判断,直接将null传入了要求Map<String, dynamic>类型参数的Image.fromJson方法。
按照以下逻辑修改即可:
- 将
Test类中的image字段改为可空类型Image?,同时去掉构造方法中该字段的required修饰 - 在
fromJson解析逻辑中增加判空逻辑,仅当json['image']不为null时才执行Image.fromJson解析 - 调整
toJson方法的逻辑,image为null时不要调用toJson,直接赋值null即可
如果你的业务场景需要image为null时返回默认值而非空对象,也可以在判空时给默认值,不用声明可空。
修改后的完整代码如下:
class Test { Test({ required this.debug, required this.devide, this.image, // 去掉required修饰 }); late final String debug; late final String devide; late final Image? image; // 改为可空类型Image? Test.fromJson(Map<String, dynamic> json){ debug = json['debug']; devide = json['devide']; // 增加判空逻辑 image = json['image'] != null ? Image.fromJson(json['image']) : null; } Map<String, dynamic> toJson() { final _data = <String, dynamic>{}; _data['debug'] = debug; _data['devide'] = devide; // 空安全调用toJson,避免空指针 _data['image'] = image?.toJson(); return _data; } } class Image { Image({ required this.src, required this.name, required this.hOffset, required this.vOffset, required this.alignment, }); late final String src; late final String name; late final int hOffset; late final int vOffset; late final String alignment; Image.fromJson(Map<String, dynamic> json){ src = json['src']; name = json['name']; hOffset = json['hOffset']; vOffset = json['vOffset']; alignment = json['alignment']; } Map<String, dynamic> toJson() { final _data = <String, dynamic>{}; _data['src'] = src; _data['name'] = name; _data['hOffset'] = hOffset; _data['vOffset'] = vOffset; _data['alignment'] = alignment; return _data; } }
如果你不需要可空类型,想要image为空时返回默认占位对象,把解析逻辑改成以下形式即可,此时image字段可以保留非空类型和required修饰:
image = json['image'] != null ? Image.fromJson(json['image']) : Image(src: '', name: '', hOffset: 0, vOffset: 0, alignment: 'center');
内容的提问来源于stack exchange,提问作者Code with Benji
相关产品推荐
相关产品推荐

