Using Gson in Kotlin to parse JSON array
尝试在Kotlin中解析JSON数组,使其可用于单个JSON对象到WeatherObject对象(下面的代码段)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | { "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
就像是:
1 | fun getWeatherObjectArrayFromJson(jsonStr: String): ArrayList<WeatherObject > |
gsonBuilder.registerTypeAdapter(ArrayList
更新:
尝试从chandil03解决方案,它正在工作! 将测试json数组数据和函数放在此处:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
}
试过了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 } |
在有例外
1 2 3 | 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数组数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | [ { "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 } ] |
您需要在
1 | val weatherList: List<WeatherObject> = gson.fromJson(stringReader , Array<WeatherObject>::class.java).toList() |
您需要传递
检查以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 } |