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

Flutter中如何利用Enhanced Enum实现JSON值映射

增强枚举与JSON值的映射实现

你可以通过在增强枚举内部添加静态方法或者静态映射表来实现JSON值到枚举实例的映射,以下是具体修改方案:

方案1:添加静态fromValue方法

直接在MyEnhancedEnum中实现一个静态方法,遍历枚举值匹配对应的字符串:

enum MyEnhancedEnum {
  valueOne("One"),
  valueTwo("Two"),
  valueUnknown("");

  const MyEnhancedEnum(this.value);
  final String value;

  // 根据JSON字符串值返回对应的枚举,匹配失败则返回unknown
  static MyEnhancedEnum fromValue(String? value) {
    return MyEnhancedEnum.values.firstWhere(
      (enumValue) => enumValue.value == value,
      orElse: () => MyEnhancedEnum.valueUnknown,
    );
  }
}

随后在MyObject.fromJson中直接调用该方法:

factory MyObject.fromJson(Map<String, dynamic> json) => MyObject(
      myProperty: MyEnhancedEnum.fromValue(json["JSONPropertyValue"]),
    );

方案2:添加静态映射表

和你之前普通枚举的实现逻辑类似,但把映射表集成到增强枚举内部,提升代码内聚性:

enum MyEnhancedEnum {
  valueOne("One"),
  valueTwo("Two"),
  valueUnknown("");

  const MyEnhancedEnum(this.value);
  final String value;

  // 静态映射表:JSON字符串值 -> 对应枚举实例
  static final Map<String, MyEnhancedEnum> valueMap = {
    "One": MyEnhancedEnum.valueOne,
    "Two": MyEnhancedEnum.valueTwo,
    "": MyEnhancedEnum.valueUnknown,
  };
}

在fromJson中直接通过映射表取值,配合空值判断兜底:

factory MyObject.fromJson(Map<String, dynamic> json) => MyObject(
      myProperty: MyEnhancedEnum.valueMap[json["JSONPropertyValue"]] ?? MyEnhancedEnum.valueUnknown,
    );

完整修改后的代码示例

List<MyObject?>? objects = List<MyObject?>.from(json["MyObject"]!.map((x) => MyObject.fromJson(x)));

class MyObject {
  MyObject({
    this.myProperty,
  });

  MyEnhancedEnum? myProperty = MyEnhancedEnum.valueUnknown;

  factory MyObject.fromJson(Map<String, dynamic> json) => MyObject(
        myProperty: MyEnhancedEnum.fromValue(json["JSONPropertyValue"]),
      );
}

enum MyEnhancedEnum {
  valueOne("One"),
  valueTwo("Two"),
  valueUnknown("");

  const MyEnhancedEnum(this.value);
  final String value;

  static MyEnhancedEnum fromValue(String? value) {
    return MyEnhancedEnum.values.firstWhere(
      (enumValue) => enumValue.value == value,
      orElse: () => MyEnhancedEnum.valueUnknown,
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:05:55