首页 > 解决方案 > 从 json 解析枚举

问题描述

我有一个enum

enum Mode { standard, relative, fixed }

extension ModeMap on Mode {
  static const valueMap = {
    Mode.standard: "standard",
    Mode.relative: "relative",
    Mode.fixed: "fixed",
  };
  String? get value => valueMap[this];
}

以及使用此枚举和方法的模型fromJson

class Settings {
  Mode mode;
  String name;

  Settings({
    required this.mode,
    required this.name,
  });

  Settings.fromJson(Map<String, dynamic> json)
      : mode = Mode[json['Mode'].toString()] as Mode,
        name = json['Name'],


  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['Mode'] = mode.value;
    data['Name'] = name;
    return data;
  }
}

但是,似乎我无法以这种方式将值从 json 转换为我的枚举。这样做的正确方法是什么?

标签: jsonflutterparsingenums

解决方案


你可以做你对value吸气剂所做的相反的事情。以下代码fromString通过反转您Mode的. 然后,您可以在工厂构造函数中使用它。StringvalueMapModeMap.fromString(json['Mode'])

enum Mode { standard, relative, fixed }

extension ModeMap on Mode {
  static const valueMap = {
    Mode.standard: "standard",
    Mode.relative: "relative",
    Mode.fixed: "fixed",
  };
  String? get value => valueMap[this];
  
  static Mode fromString(String input) {
    final reverseValueMap = valueMap.map<String, Mode>((key, value) => MapEntry(value, key));
    
    Mode? output = reverseValueMap[input];
    if(output == null) {
      throw 'Invalid String Input';
    }
    
    return output;
  }
}

class Settings {
  Mode mode;
  String name;

  Settings({
    required this.mode,
    required this.name,
  });

  Settings.fromJson(Map<String, dynamic> json)
      : mode = ModeMap.fromString(json['Mode']),
        name = json['Name'];


  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['Mode'] = mode.value;
    data['Name'] = name;
    return data;
  }
}

推荐阅读