You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:54:03