使用 Retrofit 时,Firestore 时间戳为(秒:0,纳秒:0)

Firestore Timestamp is (seconds: 0, nanoseconds: 0) when using Retrofit

提问人:Bartek Pacia 提问时间:7/26/2019 最后编辑:Bartek Pacia 更新时间:4/13/2022 访问量:4728

问:

我遇到了与在Android应用程序中解析Firestore时间戳有关的问题。

总结

在我的 Firebase Firestore 中,我收集了大量评论。每条评论看起来都是这样的

comment

(time 的类型为 Timestamp)

我使用 Cloud Functions 构建了 REST API。注释端点有一个 GET 方法。共享整个代码没有意义,重要的事实是,来自该端点的响应如下所示

comment_response

正如你所看到的,反应看起来不错,一切都很好。

问题

现在,我有了使用 Retrofit 与 API 通信的 Android 应用程序。它向上述端点发出请求并获取响应(响应是 )。<List<CommentResponse>>

import com.google.firebase.Timestamp

data class CommentResponse(
    val placeId: String,
    val userUid: String,
    val userDisplayName: String,
    val userPhotoUrl: String,
    val time: Timestamp,
    val text: String
)

但是当我这样做时,我得到(我剪掉了不重要的数据)Log.d(response.body)

[CommentResponse(placeId=opactwo, userUid=e09E...82, userDisplayName=Bartek Pacia, userPhotoUrl=https: .../photo.jpg, time=Timestamp(seconds=0, nanoseconds=0), text=This place is very beautiful :D)]

时间戳消失了。它不是 null,但它指向纪元的开始(1.1.1970)。它只是 0 秒、0 纳秒。我不使用任何自定义转换器或其他任何东西,只是“初级改造”。

而且,嗯,就是这样。 我不知道为什么时间戳变为 0,0。

如果有人能帮助我,我将不胜感激。 先谢谢你。

Android Firebase google-cloud-functions 改造

评论

0赞 ρяσѕρєя K 7/26/2019
time是包含和键的 JsonObjectsecondsnanoseconds

答:

3赞 Doug Stevenson 7/26/2019 #1

假设 Retrofit 知道如何根据时间戳从服务器的默认 JSON 序列化来反序列化时间戳。它不知道该怎么做。你将不得不自己管理它。

当函数序列化时间戳时,它使用文档内容的默认序列化。它正在查看 Timestamp 对象并说“嘿,有一个对象,所以为了序列化它,我只需将其所有属性复制到输出中”。如果查看 Timestamp 的源代码,就会发现它使用属性 _seconds 和 _nanoseconds 来保存 Timestamp 的组件。因此,这解释了您看到的 JSON 输出。

在 Java(或 Kotlin)客户端,所有实际上都只是一个 Map 对象,类型信息消失了(这不会有帮助,因为 JavaScript 的东西不会简单地映射到 Java 的东西)。没有人知道这是一条线,它是一个 Timestamp 类型的对象。它只知道有一个_seconds和_nanoseconds的物体。

你需要做的是把一些智能放到你的代码中(也许作为对 Retrofit 的提示,以自定义转换器的形式),以帮助它识别该 JSON 对象中的内容,并使用 java Timestamp 构造函数在本地将其转换为 Timestamp 对象。time

或者,如果您不介意损失几纳秒的精度,只需让函数将时间戳转换为以毫秒为单位的时间,通过网络发送,然后让客户端简单地将其转换为 java Date 对象。

您可能还希望根据 JavaScript Timestamp 对象的内部详细信息进行停止。由于_seconds和_nanoseconds实际上是私人细节,因此您依赖于将来可能会更改的内容。请考虑使用函数公共方法 getSeconds() 和 getNanoseconds() 中的数据在函数中显式序列化 Timestamp。

评论

0赞 Bartek Pacia 7/26/2019
感谢您如此详尽的回复。纳秒对我来说并不重要。我将在 API 响应中返回毫秒,并在客户端将其解析为 Date :)