【问题标题】:Handle retrofit 2 response object with a field with type String or type Array使用 String 类型或 Array 类型的字段处理改造 2 响应对象
【发布时间】:2017-02-22 17:23:24
【问题描述】:

我正在尝试使用 api 检索项目列表。 api被设计成在项目列表中,一个项目中的一个字段是一个字符串,另一个项目中的相同字段是一个数组。如果我将该字段声明为数组,则改造会引发错误,因为在某些情况下它会返回字符串。如何在两种情况下使用一个字段。我尝试将其声明为对象,然后将其转换为适当的对象列表,但它会引发异常,因为在这种情况下,类型是 LinkedTreeMap 列表。我正在使用 Gson 进行反序列化。

例子:

{
    [
        {
            "field": ""
        },
        {
            "field": [{},{},{}]
        }
    ]
}

【问题讨论】:

  • 请您的 web api 开发人员更改 api 的结构。在这两种情况下都使用对象列表
  • @Shubham 是对的:如果可能,要求 API 保持一致。如果由于某种原因无法更改 API,您可能会对类似的问题/答案感兴趣:stackoverflow.com/questions/42314056/…
  • @Shubham api是第三方api,所以无法更改。
  • @RobertMarkovski 您的 JSON 实际上格式不正确(由于在编辑/发布问题时可能丢失了 JSON 结构导致的语法问题)。另一件事是 Gson 默认使用 ArrayList 解析 JSON 数组,因此在这种情况下将其转换为 List 是完全合法的。但是如果你得到LinkedTreeMap,那么你一定有一个错误的映射:Gson 使用LinkedTreeMaps 来反序列化 JSON 对象,所以这种类型转换是非法的。只要确保你的映射是正确的。
  • @LyubomyrShaydariv 问题是我不知道要使用什么映射。 api不一致。如果该字段有数据,它将返回对象列表,但当没有数据时,它返回空字符串而不是空列表。因此,如果我尝试使用 List 映射它,它会崩溃,因为某些项目将返回空字符串。

标签: android gson retrofit2


【解决方案1】:

您可以构建自定义反序列化器并根据任何条件对任何字段做出反应,在您的对象中,该字段可能是“任何”类型,但您可能会失去映射到对象的点。

Here你可以找到一些例子

【讨论】:

    猜你喜欢
    • 2018-05-26
    • 2021-12-21
    • 1970-01-01
    • 2020-05-13
    • 2021-04-02
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    相关资源
    最近更新 更多