Parse enum from json

434

You could do the reverse of what you did with the value getter. The following code makes a fromString method to get a Mode from a String by reversing your valueMap. You then can use it with ModeMap.fromString(json['Mode']) in your factory constructor.

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;
  }
}
Share:
434
Heikkisorsa
Author by

Heikkisorsa

Updated on December 29, 2022

Comments

  • Heikkisorsa
    Heikkisorsa over 1 year

    I have an 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];
    }
    

    And a model using this enum with a method 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;
      }
    }
    

    However, it seems that I can't transform the values from json to my enum this way. What is the proper way to do this?