4

我查看了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 库没有做这么简单的事情,或者我错过了什么?谢谢。

4

3 回答 3

9

现在我找到了解决方案,只需在 build.yaml 中设置即可

explicit_to_json = 真。

并重新生成 .g 文件。它现在应该为您将其转换为 Map。

于 2018-11-27T10:23:34.417 回答
3

对于firebase,您any_map还需要该选项,因为来自firebase的地图<dynamic, dynamic>否则会期望<String, dynamic>

在您的颤振项目的根目录中创建此文件build.yaml,默认情况下它不存在。

targets:
  $default:
    builders:
      json_serializable:
        options:
          any_map: true
          explicit_to_json: true
于 2019-05-11T00:54:02.453 回答
1

json.encode(...)将尝试toJson()在类上查找方法Item,并正确序列化项目。生成的序列化逻辑无需调用toJson().

您只需要确保Item该类也使用@JsonSerializable()和 implements进行注释toJson()


此外,您永远不会toJson()手动调用,而是将您的订单对象传递给json.encode(...)

于 2018-11-24T14:26:19.503 回答