【问题标题】:Retrofit - Convert Json response to easily store data with RoomRetrofit - 转换 Json 响应以使用 Room 轻松存储数据
【发布时间】:2019-11-21 02:25:24
【问题描述】:

是否可以转换:

{
"news": [
 {
  "nid": 1,
  "type": "test1",
 },
 {
  "nid": 2,
  "type": "test2",
 }
]
}

当我收到 Retrofit 的结果时要这样做吗?

 {
  "nid": 1,
  "type": "test1",
 },
 {
  "nid": 2,
  "type": "test2",
 }

实际上,在我的模型中,我有一个 NewsList 对象,其中包含一个 News 列表(其中包含值:nid、type)。
Retrofit 查询看起来像这样:

@GET("test/test.json")
suspend fun getListNews(): Response<Newslist>

一切正常,但现在我需要将这些数据保存在带有 Room 的数据库中,如果 Retrofit 查询是这样的会更容易:

@GET("test/test.json")
suspend fun getListNews(): Response<List<News>

实现这一目标的最佳方法是什么?

  1. 转换 Json 响应以获得类似上面的内容?
  2. 保留这样的内容并将 NewsList 转换为能够存储在房间数据库中?

【问题讨论】:

  • 如果Newslist 对象包含News 的列表,为什么不能使用Newslist.news 获取News 的列表

标签: android kotlin retrofit2 android-room


【解决方案1】:

最好的方法是使用 RXJava 或 Kotlin 的 Coroutine。

在 RXJava 中,您可以使用 map 运算符将响应对象转换为对象列表。

请参考以下链接以了解使用 RXJava 进行改造和转换结果的一些想法:

https://www.journaldev.com/20433/android-rxjava-retrofit

【讨论】:

    【解决方案2】:

    最好的方法是让您的后端服务器返回规范的 json 数据。

    如果不行,可以通过addConverterFactory方法自定义converterFactor,在自定义converterFactor中兼容这种数据格式。

    【讨论】:

    • 是的,但我无法更改 API。请问你有什么关于converterFactor有用的东西吗?
    • 您可以在转换器工厂中使用正则表达式来检查数据是否是您想要的格式,如果是则解析它,否则将字符串拼接成您的格式,您可以根据此修改转换器. github.com/square/retrofit/blob/master/retrofit-converters/gson/…
    【解决方案3】:

    首先,您必须为数据提供者提供一层以提供给消费者(活动、VM、片段等)。 在这一层,您有用例来定义来自云(改造)或本地存储(房间)的数据收集。更多信息,我有样品here

    【讨论】:

      【解决方案4】:

      是的,您可以,使用数据类,您只需要创建一个名为 news 的数据类,其中包含带有“nid”和“type”的项目列表,在这种情况下,我使用 Android Studio 的插件称为 Kotlin 数据类来自 JSON 的文件

      【讨论】:

        【解决方案5】:

        我认为更好的方法是返回 NewsList 对象,因为它使您更容易兼容新功能更新,例如向 NewsList 对象添加更多字段。您可以创建一个新层来将数据保存到房间数据库,并将原始数据转换为 List 进行保存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-02
          • 1970-01-01
          • 2017-07-20
          相关资源
          最近更新 更多