【问题标题】:How to parse a json list of multiple type in Moshi如何在 Moshi 中解析多种类型的 json 列表
【发布时间】:2016-10-19 04:43:13
【问题描述】:

得到一个混合了普通字符串和图像对象的 json 列表,如下所示:

 {
  "mixList": [
    "string",
    {
      "imageUrl": "http://...",
      "height": 320,
      "width": 480
    }
  ]
}

如何用 Moshi 解析?

我希望有一个List<Data>StringData extends DataImageData extends Data

【问题讨论】:

  • 为什么要使用 moshi library 解析 json。 Android proivde 内置功能来解析 org.json 下的 json
  • @RahulKhurana 我只是在玩 Retrofit + OkHttp + Moshi,因为它们都来自 Square。 Moshi 似乎是一个易于使用的库,但可能性较小。这就是我发布这个的原因,看看我是否遗漏了什么。
  • @DheerubhaiBansal 哪个部分?我认为这部分是有效的:[..., ...]

标签: android json moshi


【解决方案1】:

我已经使用MoshiCustomAdaptor 解决了这个问题。经过大量研究,我无法找到更好的“开箱即用”解决方案。此解决方案位于 kotlin 中,但也可以轻松移植到 Java。

首先让我们在这里定义我们试图解析的类型。我将调用包装器类型,其中包含mixListResponse

@JsonClass(generateAdapter = true)
data class Response(val mix_types: Data)

以及StringDataImageData 列表中的两种不同类型:

sealed class Data {
    data class StringData(val value: String) : Data()

    @JsonClass(generateAdapter = true)
    data class ImageData(
        val imageUrl: String,
        val height: Int,
        val width: Int
    ) : Data()
}

由于我使用的是 Moshi 代码生成,所以我用 @JsonClass(generateAdapter = true) 注释了 ResponseImageData,以便 Moshi 将为这些类型生成适配器(我将在我的自定义适配器中利用它) .

我想为 Data 类型提供我自己的自定义适配器,我也不希望 Moshi 为 StringData 类型生成适配器,因为这正是我想要序列化/反序列化为字符串,所以我不会注释这些类。

现在我要像这样编写我的自定义适配器:

class DataCustomAdapter {
    @FromJson
    fun fromJson(jsonReader: JsonReader, delegate: JsonAdapter<ImageData>): Data? {
        return if (jsonReader.peek() == BEGIN_OBJECT) {
            delegate.fromJson(jsonReader)
        } else {
            StringData(jsonReader.nextString())
        }
    }

    @ToJson
    fun toJson(jsonWriter: JsonWriter, data: Data, delegate: JsonAdapter<ImageData>) {
        when (data) {
            is ImageData -> delegate.toJson(jsonWriter, data)
            is StringData -> jsonWriter.value(data.value)
        }
    }
}

现在缺少的只是向 Moshi 注册自定义适配器:

private val moshi = Moshi.Builder()
    .add(DataCustomAdapter())
    .build()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 2019-02-01
    • 2021-02-06
    • 2018-02-14
    • 2021-10-16
    • 2016-08-31
    • 2021-05-15
    • 2021-07-05
    相关资源
    最近更新 更多