【问题标题】:flutter json_serializable tojson does not work properly颤振 json_serializable tojson 无法正常工作
【发布时间】:2018-11-24 13:17:36
【问题描述】:

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

【问题讨论】:

    标签: flutter json-serialization


    【解决方案1】:

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

    explicit_to_json = true。

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

    【讨论】:

      【解决方案2】:

      对于firebase,您还需要any_map 选项,因为来自firebase 的地图是&lt;dynamic, dynamic&gt;,否则它会期望&lt;String, dynamic&gt;

      在你的flutter项目的根目录下创建这个文件为build.yaml,默认不存在。

      targets:
        $default:
          builders:
            json_serializable:
              options:
                any_map: true
                explicit_to_json: true
      

      【讨论】:

        【解决方案3】:

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

        您只需确保Item 类也使用@JsonSerializable() 进行注释并实现toJson()


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

        【讨论】:

        • 感谢您的回复@boformer,我确实理解编码会正确转换它,但我正在寻找的是返回的地图,而编码返回一个 json 字符串。我使用的 Firestore 库期望数据是 Map 类型,因此我将不得不再次使用 decode 将其转换回 Map 类型。我认为如果 .g 文件应该使用 instance.item.toJson() 来节省我们额外的工作量。
        • 这种情况下你可能需要自己编写序列化代码
        猜你喜欢
        • 2019-08-29
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2021-12-27
        • 2021-03-29
        • 2018-05-12
        • 2022-01-24
        相关资源
        最近更新 更多