将json列表与普通的String和Image对象混合,如下所示:
{
"mixList": [
"string",
{
"imageUrl": "http://...",
"height": 320,
"width": 480
}
]
}
如何用Moshi解析?
我希望有List<Data>
,
其中StringData extends Data
和ImageData extends Data
答案 0 :(得分:0)
我已经使用Moshi
和CustomAdaptor
解决了这个问题。经过大量研究,我找不到更好的“开箱即用”解决方案。此解决方案位于kotlin
中,但也可以轻松移植到Java。
首先让我们定义我们要在此处解析的类型。我将称呼包装类型,其中包含mixList
,Response
:
@JsonClass(generateAdapter = true)
data class Response(val mix_types: Data)
以及列表StringData
和ImageData
中可以使用的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.