我正在查看Order类示例,发现Item类未转换为Map。
class Order {
int count;
int itemNumber;
bool isRushed;
Item item;
Map<String, dynamic> toJson() => _$OrderToJson(this);
}
生成的.g文件具有以下内容:
Map<String, dynamic> _$OrderToJson(Order instance) {
...
writeNotNull('item', instance.item);
...
return val;
}
订单地图中的商品仍为商品类型,但我希望它也能自动转换为地图。生成的.g文件应具有以下内容
writeNotNull('item', instance.item.toJson());
我不想手动添加它,因为当重新生成.g文件时,它将被覆盖。为什么json_serializable lib没有做这么简单的事情,还是我缺少了什么?谢谢。
答案 0 :(得分:2)
现在我找到了解决方案,只需在build.yaml中设置
explicit_to_json = true。
并重新生成.g文件。它现在应该可以将其转换为Map。
答案 1 :(得分:0)
json.encode(...)
将尝试在toJson()
类上找到一个Item
方法,并正确序列化该项目。不需要生成的序列化逻辑来调用toJson()
。
您只需要确保Item
类也用@JsonSerializable()
注释并实现toJson()
。
此外,您永远不会手动调用toJson()
,而是将订单对象传递给json.encode(...)
答案 2 :(得分:0)
对于Firebase,您还需要any_map
选项,因为来自Firebase的地图是<dynamic, dynamic>
,否则会期望<String, dynamic>
在flutter项目的根目录中将此文件创建为build.yaml
,默认情况下不存在。
targets:
$default:
builders:
json_serializable:
options:
any_map: true
explicit_to_json: true