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'
}
根据docs,jsonEncode
会寻找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
上查看
在 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'
}
根据docs,jsonEncode
会寻找toJson()
方法。
当直接在枚举上调用时,扩展工作正常,但不知何故 jsonEncode 找不到 toJSON。
知道这是错误还是预期的行为?
否则,我可以使用枚举并以某种方式定义一些与 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
上查看