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

Flutter中自定义类解析JSON时出现类型不匹配错误的解决咨询

解决Dart JSON解析中类型不匹配的问题

这个错误的核心原因很清晰:你直接把JSON里的value字段(本质是Map类型)赋值给了Value类型的变量,没有通过Value.fromJson工厂方法完成类型转换。另外你的数据集里存在value为空对象的情况,也需要做兼容处理避免崩溃。

分步修复方案

1. 调整Value类,兼容空值/缺失字段

考虑到数据集中可能存在空的value对象,我们需要让Value的构造器和fromJson方法支持空输入:

class Value {
  final String? apple; // 改为可空类型,或根据业务需求设置默认值
  final String? pear;

  // 去掉required,允许创建空实例
  Value({this.apple, this.pear});

  factory Value.fromJson(Map<dynamic, dynamic>? json) {
    // 处理json为null的情况
    if (json == null) {
      return Value();
    }
    return Value(
      apple: json['apple'] as String?,
      pear: json['pear'] as String?,
    );
  }
}

如果你的业务要求apple和pear必须非空,可以给字段设置默认值:

apple: json['apple'] as String? ?? '默认内容',
pear: json['pear'] as String? ?? '默认内容',

2. 修复Item类的fromJson方法

关键是调用Value.fromJson将JSON对象转换为Value实例,同时确保photos的类型转换正确:

class Item {
  final String title;
  final List<String> photos;
  final Value value;

  Item({required this.title, required this.photos, required this.value});

  factory Item.fromJson(Map<dynamic, dynamic> json) {
    return Item(
      title: json['title'] as String,
      // 将JSON数组显式转换为List<String>
      photos: List<String>.from(json['photos']),
      // 调用Value.fromJson完成类型转换
      value: Value.fromJson(json['value'] as Map<dynamic, dynamic>?),
    );
  }
}

关键知识点说明

  • 类型转换核心:JSON中的嵌套对象(value字段)本质是Map,必须通过对应类的fromJson方法转换成自定义类实例,不能直接赋值。
  • 空值兼容:数据集里存在空value对象时,必须让fromJson方法支持处理null或空Map,否则会触发空指针异常。
  • List类型安全:JSON数组需要显式转换为List<String>,避免隐式类型转换带来的类型不匹配错误。

内容的提问来源于stack exchange,提问作者marielle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:42:37