在kotlin中使用Gson来解析json数组

试图解析kotlin中的json数组,使其适用于WeatherObject对象的单个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 }, "dt": 1429773245, "id": 3128026, "name": "Bilbao", "cod": 200 

}

但不知道如何做到这一点,如果json是一个相同的json对象的数组,即

从json数组[{},{} …]到ArrayList <WeatherObject>

就像是:

 fun getWeatherObjectArrayFromJson(jsonStr: String): ArrayList&lt;WeatherObject &gt 

gsonBuilder.registerTypeAdapter(ArrayList <WeatherObject&gt; 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 } 

更新:

尝试从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 } 

得到例外

 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 $ 

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 } ] 

您需要在fromJson()函数调用中更改参数,如下所示:

 val weatherList: List<WeatherObject> = gson.fromJson(stringReader , Array<WeatherObject>::class.java).toList() 

您需要为类类型传递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 }