关于android:在Kotlin中使用Gson解析JSON数组

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 &gt

gsonBuilder.registerTypeAdapter(ArrayList

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
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数组数据和函数放在此处:

试过了

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

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

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

您需要传递Array::class.java作为类类型,然后将结果转换为List。 无需更改registerTypeAdapter()函数调用。

检查以下代码:

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
    }