【问题标题】:Android Retrofit - parse objects as listAndroid Retrofit - 将对象解析为列表
【发布时间】:2019-05-24 06:53:48
【问题描述】:

我正在使用改造从物语中获取数据。我得到的响应是包含 JSON 对象,如“field1”、“field2”等。是否可以通过 Retrofit 解析这些数据以获取包含这些元素的列表?

现在我的解析是这样的:

@SerializedName("field1")
val field1: Float?,
@SerializedName("field2")
val field2: Float?,
@SerializedName("field3")
val field3: Float?,
@SerializedName("field4")
val field4: Float?,
@SerializedName("field5")
val field5: Float?,
@SerializedName("field6")
val field6: Float?,
@SerializedName("field7")
val field7: Float?,
@SerializedName("field8")
val field8: Float?

我得到的回应:

{"created_at":"2019-05-24T06:11:43Z","entry_id":15419693,"field1":"370","field2":"56.390658174097666"}

我想得到这样的东西:

@SerializedName("field[]")
val fields List<Float>

这有可能吗?

【问题讨论】:

  • 不! @SerializedName("field[]") 表示您的Web Api response 中有动态键,Retrofit 无法处理。键必须是静态值可能是动态的。
  • @NickBapu - 所以我唯一能做的就是为每个值使用单独的字段?像@SerializedName("field1")、@SerializedName("field2") 等?
  • 是的。我以前从未见过JSON object's 键是动态的!

标签: android retrofit


【解决方案1】:

您可以创建自定义 JSON 解析器,但不建议这样做。使用 Retrofit 解析器会好很多。

您无法按照您的描述进行解析,但是如果您可以更新服务器响应会更好,所以它看起来像这样:

{"created_at":"2019-05-24T06:11:43Z","entry_id":15419693,"fields":["370",:"56.390658174097666", "45"]}

然后在你的类中定义

 @SerializedName("fields")
 var fields: List<Float>?

编辑:

如果你不能更新服务器响应,你能做的就是定义辅助函数:

 public fun getFields() : ArrayList<Float?> {
        var list = ArrayList<Float?>()

        list.add(field1)
        list.add(field2)
        list.add(field3)
        list.add(field4)
        list.add(field5)
        list.add(field6)
        list.add(field7)
        list.add(field8)

        list.removeIf { it == null }

        return list;
}

【讨论】:

  • 很遗憾,回复来自 thingspeak.com,我无法更改。
  • 我已经编辑了答案,它只是有帮助,它不能解决您的问题:) 它应该在服务器端修复。
猜你喜欢
  • 2018-12-30
  • 2019-11-26
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2015-06-12
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多