Flutter enum 做 Json 序列化時指定整數值

json_serializable 預設會把 enum 序列化為字串,有時候需要序列化為整數值

假設有個 class 定義如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import 'package:json_annotation/json_annotation.dart';

part 'fruit.g.dart';

enum Fruit {
  apple,
  banana,
  orange,
}

@JsonSerializable()
class Test {
  final Fruit fruit;
  Test({this.fruit});
  factory Test.fromJson(Map<String, dynamic> json) => _$TestFromJson(json);
  Map<String, dynamic> toJson() => _$TestToJson(this);
}

序列化為 json 結果

1
print(jsonEncode(Test(fruit: Fruit.apple))); // {"fruit":"apple"}

如果想要讓 enum 表示為整數值,可以用 @JsonValue 指定列舉值

1
2
3
4
5
6
7
8
enum Fruit {
  @JsonValue(0)
  apple,
  @JsonValue(1)
  banana,
  @JsonValue(2)
  orange,
}

這樣結果會變成

1
print(jsonEncode(Test(fruit: Fruit.apple))); // {"fruit":0}

json_serializable 的 example 裡面似乎沒寫到 JsonValue 🤣

Reference