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

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字段无效?

  1. 反序列化时未调用fromJson,直接将Map赋值给类实例,必然触发类型不匹配错误
  2. 枚举未配置json_annotation规则,即使调用fromJson也无法自动将数字/字符串映射为枚举值

内容的提问来源于stack exchange,提问作者Dr.No

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:02:12