如何在Moshi中解析多个类型的json列表

时间:2016-10-19 04:43:13

标签: android json moshi

将json列表与普通的String和Image对象混合,如下所示:

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

如何用Moshi解析?

我希望有List<Data>, 其中StringData extends DataImageData extends Data

2 个答案:

答案 0 :(得分:0)

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

首先让我们定义我们要在此处解析的类型。我将称呼包装类型,其中包含mixListResponse

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

以及列表StringDataImageData中可以使用的2种不同类型:

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代码源,因此我用Response注释了ImageData@JsonClass(generateAdapter = true),以便Moshi会为这些类型生成适配器(我将利用在我的自定义适配器中)。

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

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

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()

答案 1 :(得分:-7)

JSONObject obj=new JSONObject(your json in string);
JSONArray array=obj.getJSONArray("mixList");
JSONObject o=array.getJSONObject(1);
String img=o.getString("imageUrl"); // and so on.