【问题标题】:How to serialize GeoPoint using dart json_serializable package如何使用 dart json_serializable 包序列化 GeoPoint
【发布时间】:2021-07-29 18:23:39
【问题描述】:

我正在尝试使用以下软件包按距离过滤我的 Firestore 集合。

https://github.com/fluttercommunity/firestore_helpers

参考他们的示例,他们正在使用 jaguar_serializer 将从 Firestore 接收到的数据转换为 Location 类。我已经在我的应用程序中实现了他们的 getDataInArea 函数,但我目前被卡住了,因为我使用的是 json_serializable。

我环顾四周,发现如果在以下链接中使用built_value,则有关于如何处理 GeoPoint 的建议。

https://github.com/google/built_value.dart/issues/417#issuecomment-391661750

所以我想知道有没有办法实现类似于 jaguar_serializer 和 built_value 中显示的内容,但使用 json_serializable 包代替。

我猜一种方法是使用@JsonKey(fromJson: , toJson: ),但我不太确定如何去做。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    经过更多的挖掘并试图了解事情的运作方式。我已经设法通过在课堂上写下以下内容来解决我的问题。

      @JsonKey(fromJson: _fromJsonGeoPoint, toJson: _toJsonGeoPoint)
      GeoPoint location;
    
      static GeoPoint _fromJsonGeoPoint(GeoPoint geoPoint) {
        return geoPoint;
      }
    
      static GeoPoint _toJsonGeoPoint(GeoPoint geoPoint) {
        return geoPoint;
      }
    

    我想这个想法只是不对 GeoPoint 对象进行任何更改。无论如何,我很想听到这是正确的方法,或者有更好的方法来做到这一点。干杯!

    【讨论】:

      【解决方案2】:

      您的解决方案对我不起作用。例如,如果您尝试在对象上使用 jsonEncode,它将失败。欢迎其他人的反馈。这是我的建议:

      @JsonKey(fromJson: _fromJsonGeoPoint, toJson: _toJsonGeoPoint)
      GeoPoint position;
      

      static GeoPoint _fromJsonGeoPoint(GeoPoint geoPoint) { return geoPoint; }

      ///A Map should be returned here to properly generate the json
      static Map<String, dynamic> _toJsonGeoPoint(GeoPoint geoPoint) {
      return {"latitude": geoPoint.latitude, "longitude":
      geoPoint.longitude};
      }
      

      【讨论】:

        【解决方案3】:

        Firestore 返回的类型是 GeoPoint,你可以直接通过 使用 JsonConverter:

        class GeoPointConverter
            implements JsonConverter<GeoPoint, GeoPoint> {
          const GeoPointConverter();
        
          @override
          GeoPoint fromJson(GeoPoint geoPoint) {
            return geoPoint;
          }
        
          @override
          GeoPoint toJson(GeoPoint geoPoint) =>
              geoPoint;
        }
        

        之后,注释您的参数: @GeoPointConverter() required GeoPoint location

        【讨论】:

          猜你喜欢
          • 2019-08-16
          • 2019-10-09
          • 1970-01-01
          • 2019-02-26
          • 1970-01-01
          • 2019-09-18
          • 1970-01-01
          • 2019-08-23
          • 1970-01-01
          相关资源
          最近更新 更多