Dart使用json_annotation处理枚举JSON编解码失败求助
问题解决步骤
1. 给枚举添加JSON序列化支持
默认json_annotation无法直接处理自定义构造的枚举,需添加注解并明确序列化规则:
import 'package:json_annotation/json_annotation.dart'; @JsonEnum() enum EFileCreateMode { create(0), append(1), insert(2); final int _iIndex; const EFileCreateMode(this._iIndex); static String infoStr() { String infoStr = ""; for (EFileCreateMode entry in values) { String newEntry = "${entry._iIndex}(${entry.name})"; infoStr = infoStr.isEmpty ? newEntry : "$infoStr,$newEntry"; } return infoStr; } }
2. 替换自定义序列化方法为生成逻辑
你当前的jsonString用Dart默认编码器,未调用json_annotation生成的toJson,导致枚举序列化不规范。修改EFileCreateModeTest:
// ignore: camel_case_types @JsonSerializable() class EFileCreateModeTest { String EFileCreateModeInfo = EFileCreateMode.infoStr(); late EFileCreateMode eFileCreateMode; EFileCreateModeTest() { eFileCreateMode = EFileCreateMode.create; } // 替换原jsonString方法 String jsonString() { var encoder = JsonEncoder.withIndent(" "); return encoder.convert(toJson()); } factory EFileCreateModeTest.fromJson(Map<String, dynamic> json) => _$EFileCreateModeTestFromJson(json); Map<String, dynamic> toJson() => _$EFileCreateModeTestToJson(this); }
3. 修复反序列化代码
jsonDecode返回的是Map<String, dynamic>,不能直接赋值给类实例,必须调用fromJson工厂方法:
try { final jsonMap = jsonDecode(jsonString2) as Map<String, dynamic>; newEFileCreateModeTest = EFileCreateModeTest.fromJson(jsonMap); } catch (e) { print("FATAL: Decode Test failed with $e"); return -1; }
4. 修复对象比较逻辑
Dart默认==比较对象引用,需重写==和hashCode来比较内容:
@JsonSerializable() class EFileCreateModeTest { // ... 原有代码 ... @override bool operator ==(Object other) => identical(this, other) || other is EFileCreateModeTest && runtimeType == other.runtimeType && EFileCreateModeInfo == other.EFileCreateModeInfo && eFileCreateMode == other.eFileCreateMode; @override int get hashCode => EFileCreateModeInfo.hashCode ^ eFileCreateMode.hashCode; }
5. 重新生成序列化代码
修改完成后运行命令更新.g.dart文件:
dart run build_runner build
为什么手动修改JSON字段无效?
- 反序列化时未调用
fromJson,直接将Map赋值给类实例,必然触发类型不匹配错误 - 枚举未配置
json_annotation规则,即使调用fromJson也无法自动将数字/字符串映射为枚举值
内容的提问来源于stack exchange,提问作者Dr.No
相关产品推荐
相关产品推荐

