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



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

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'
}

根据文档,jsonEncode将查找toJson()方法。

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

Dart如何获得";值";枚举的https://dart.dev/guides/language/extension-methods

知道这是一个bug还是预期的行为吗?

否则,我可以使用枚举并以某种方式定义一些与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'

在镖靶上查看

最新更新