jsonEncode 不适用于枚举扩展;有解决方法吗?

jsonEncode doesn't work with enum extensions; is there a workaround?

在 Dart (2.15.0) 中,我试图通过定义 toJson 方法将 jsonEncode 与枚举一起使用。而且它不起作用。

import 'dart:convert';

enum Day { monday, tuesday }

extension ParseToJsonString on Day {
  String toJson() {
    return this.toString().split('.').last;
  }
}

class Saturday {
  String toJson() => "WOOHOO Saturday";
}

main() {
  //works!
  Saturday s=Saturday();
  print(s.toJson());
  print(jsonEncode(s));
  
  Day m = Day.monday;
  print(m.toJson()); //prints 'monday'
  print(m); //prints Day.monday
  print(jsonEncode(m)); // Uncaught Error: Converting object to an encodable object failed: Instance of 'Day'
}

根据docsjsonEncode会寻找toJson()方法。

当直接在枚举上调用时,扩展工作正常,但不知何故 jsonEncode 找不到 toJSON。

https://dart.dev/guides/language/extension-methods

知道这是错误还是预期的行为?

否则,我可以使用枚举并以某种方式定义一些与 jsonEncode 一起使用的东西吗?

谢谢!

我做了一些挖掘,由于 jsonEncode 的工作原理,这是正确的行为。

https://github.com/dart-lang/sdk/issues/42742

请注意,即使使用 jsonEncode 的可选参数也无法解决问题:

  print(jsonEncode(m, toEncodable: (x)=>x!.toJson()) ); // won't work.

为了克服“扩展不适用于动态类型”的问题,我们还必须使用重铸:

  print(jsonEncode(
    m,
    toEncodable: (x) {
      Day recastX = x as Day;
      return recastX.toJson();
    },
  )); // works, prints 'monday'

dartpad

上查看