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
相关产品推荐
相关产品推荐

