lan*_*nyf 26 android gson kotlin json-deserialization
试图在Kotlin中解析JSON数组,使它适用于单个JSON对象到WeatherObject对象(下面的代码片段)
{
"coord": {
"lon": -2.93,
"lat": 43.26
},
"weather": [{
"id": 802,
"main": "Clouds",
"description": "scattered clouds",
"icon": "03d"
}],
"main": {
"temp": 283.681,
"temp_min": 283.681,
"temp_max": 283.681,
"pressure": 991.72,
"sea_level": 1034.92,
"grnd_leve": 991.72,
"humidity": 98
},
"wind": {
"speed": 1.07,
"deg": 144.001
},
"dt": 1429773245,
"id": 3128026,
"name": "Bilbao",
"cod": 200
Run Code Online (Sandbox Code Playgroud)
}
但如果JSON是一个具有相同JSON对象的数组,即不确定如何做同样的事情
从json数组[{},{} ...]到ArrayList <WeatherObject>
就像是:
fun getWeatherObjectArrayFromJson(jsonStr: String): ArrayList<WeatherObject >
Run Code Online (Sandbox Code Playgroud)
有问题的gsonBuilder.registerTypeAdapter(ArrayList <WeatherObject> :: class.java,WeatherDeserializer())
class WeatherObject {
var main: String = ""
var description: String = ""
var temp: Float = 0.0f
var tempMax: Float = 0.0f
var tempMin: Float = 0.0f
var humidity: Int = 0
var wind: WindObject? = null
}
class WeatherDeserializer : JsonDeserializer<WeatherObject> {
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): WeatherObject? {
val jsonObj = json as JsonObject
val wheather = WeatherObject()
val wind = WindObject()
val jsonWeatherArray = jsonObj.getAsJsonArray("weather").get(0)
val jsonMainObj = jsonObj.getAsJsonObject("main")
val jsonWindObj = jsonObj.getAsJsonObject("wind")
wheather.main = jsonWeatherArray.asJsonObject.get("main").asString
wheather.description = jsonWeatherArray.asJsonObject.get("description").asString
wheather.temp = jsonMainObj.get("temp").asFloat
wheather.tempMax = jsonMainObj.get("temp_max").asFloat
wheather.tempMin = jsonMainObj.get("temp_min").asFloat
wheather.humidity = jsonMainObj.get("humidity").asInt
wind.speed = jsonWindObj.get("speed").asFloat
wind.deg = jsonWindObj.get("deg").asFloat
wheather.wind = wind
return wheather
}
}
fun getWeatherObjectFromJson(jsonStr: String): WeatherObject {
var stringReader: StringReader = StringReader(jsonStr)
var jsonReader: JsonReader = JsonReader(stringReader)
val gsonBuilder = GsonBuilder().serializeNulls()
gsonBuilder.registerTypeAdapter(WeatherObject::class.java, WeatherDeserializer())
val gson = gsonBuilder.create()
val weather: WeatherObject = gson.fromJson(jsonReader, WeatherObject::class.java)
return weather
}
Run Code Online (Sandbox Code Playgroud)
更新:
尝试过chandil03的解决方案,它正在工作!把测试json数组的数据和函数放在这里:
试着
fun getWeatherObjectFromJsonArray(jsonArrayStr: String): List<WeatherObject> {
var stringReader: StringReader = StringReader(jsonStr)
//var jsonReader: JsonReader = JsonReader(stringReader)
val gsonBuilder = GsonBuilder().serializeNulls()
gsonBuilder.registerTypeAdapter(WeatherObject::class.java, WeatherDeserializer())
val gson = gsonBuilder.create()
val weatherList: List<WeatherObject> = gson.fromJson(stringReader , Array<WeatherObject>::class.java).toList()
//val weatherList: List<WeatherObject> = gson.fromJson(jsonReader, Array<WeatherObject>::class.java).toList
return weatherList
}
Run Code Online (Sandbox Code Playgroud)
得到例外
val weatherList: List<WeatherObject> = gson.fromJson(stringReader , Array<WeatherObject>::class.java).toList()
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
Run Code Online (Sandbox Code Playgroud)
json数组数据如下:
[
{
"coord": {
"lon": -2.93,
"lat": 43.26
},
"weather": [{
"id": 802,
"main": "Clouds",
"description": "scattered clouds",
"icon": "03d"
}],
"main": {
"temp": 283.681,
"temp_min": 283.681,
"temp_max": 283.681,
"pressure": 991.72,
"sea_level": 1034.92,
"grnd_leve": 991.72,
"humidity": 98
},
"wind": {
"speed": 1.07,
"deg": 144.001
},
"clouds": {
"all": 36
},
"dt": 1429773245,
"id": 3128026,
"name": "Bilbao",
"cod": 200
},
{
"coord": {
"lon": -2.93,
"lat": 43.26
},
"weather": [{
"id": 802,
"main": "Clouds",
"description": "scattered clouds",
"icon": "03d"
}],
"main": {
"temp": 283.681,
"temp_min": 283.681,
"temp_max": 283.681,
"pressure": 991.72,
"sea_level": 1034.92,
"grnd_leve": 991.72,
"humidity": 98
},
"wind": {
"speed": 1.07,
"deg": 144.001
},
"clouds": {
"all": 36
},
"dt": 1429773245,
"id": 3128026,
"name": "Bilbao",
"cod": 200
}
]
Run Code Online (Sandbox Code Playgroud)
cha*_*l03 48
您需要在fromJson()函数调用中更改参数,如下所示:
val weatherList: List<WeatherObject> = gson.fromJson(stringReader , Array<WeatherObject>::class.java).toList()
Run Code Online (Sandbox Code Playgroud)
您需要传递Array<WeatherObject>::class.java类类型,然后将结果转换为List.无需更改registerTypeAdapter()函数调用.
检查以下代码:
fun getWeatherObjectFromJson(jsonStr: String): List<WeatherObject> {
var stringReader: StringReader = StringReader(jsonStr)
var jsonReader: JsonReader = JsonReader(stringReader)
val gsonBuilder = GsonBuilder().serializeNulls()
gsonBuilder.registerTypeAdapter(WeatherObject::class.java, WeatherDeserializer())
val gson = gsonBuilder.create()
val weatherList: List<WeatherObject> = gson.fromJson(stringReader , Array<WeatherObject>::class.java).toList()
return weatherList
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20226 次 |
| 最近记录: |