【发布时间】:2016-09-04 07:07:48
【问题描述】:
我有返回 json 的 api:
{"countries":[{"id":1,"name":"Australia"},{"id":2,"name":"Austria"}, ... ]}
我写模型类(Kotlin lang)
data class Country(val id: Int, val name: String)
我想使用 retoft 从 json 中的“国家”字段返回 List 的请求
我接着写:
interface DictService {
@GET("/json/countries")
public fun countries(): Observable<List<Models.Country>>
companion object {
fun create() : DictService {
val gsonBuilder = GsonBuilder()
val listType = object : TypeToken<List<Models.Country>>(){}.type
gsonBuilder.registerTypeAdapter(listType, CountriesDeserializer)
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
val service = Retrofit.Builder()
.baseUrl("...")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gsonBuilder.create()))
.build()
return service.create(DictService::class.java)
}
}
object CountriesDeserializer : JsonDeserializer<List<Models.Country>> {
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): List<Models.Country>? {
val res = ArrayList<Models.Country>()
if(json!=null) {
val countries = json.asJsonObject.get("countries")
if (countries.isJsonArray()) {
for (elem: JsonElement in countries.asJsonArray) {
res.add(Gson().fromJson(elem, Models.Country::class.java))
}
}
}
return null;
}
}
}
但我得到错误: java.lang.IllegalStateException:应为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT CountryDeserializer 代码甚至不执行! 他们想从我这里得到什么?
也许我需要编写自己的 TypeAdapterFactory?
我不想像这样使用模型类
class Countries {
public List<Country> countries;
}
【问题讨论】:
-
为什么你不想使用
data class Countries(val countries:List<Country> = listOf<Country>())? -
我认为这是不必要的实体
-
那为什么不隐藏它而不是反序列化呢?即
interface DictService { @GET("/json/countries") public fun _countries(): Observable<Countries> } data class Countries(val countries:List<Country> = listOf<Country>()) fun DictService.countries() = _countries().map { it.countries }?