Json数据个数
分为对象和数组,对象是指用大括号括起来的。数组是用中括号。
对象
//对象
{
"User":"Zhou",
"Psw":"123"
}
// 数组
[
{"User":"Zhou",
"Psw":"123"},
{"User":"Zhou",
"Psw":"123"}
]
数组里面包含对象,对象里面包含数组。对象里面的元素采用键值对形式。
{
"user": "zhou",
"pwd": "123456",
"result": [
{"user": "user1",
"pwd": "123456"},
{"user": "user2",
"pwd": "123456"}],
"Index": "0"
}
在实际情况中,一般都是一个JSON对象里面有数组和其它字段,或者是很多的嵌套,只需要一层一层的去解析就可以了。有些Json字段名字不适合做变量名,因此需要使用序列化来映射。
data class DeviceResponseJson(
@SerializedName("error_code")
val error_code: Int,
@SerializedName("result")
val result: DevResult,
)
生成Json对象
val jsonObj = JSONObject().put("user","zhou")
.put("pwd","123456")
val jsonArr = JSONArray()
jsonArr.put(0,jsonObjNew)//数组的元素是Json对象
jsonArr.put(1,jsonObjNew)
jsonObj.put("result",jsonArr)//对象的value是数组
Gson解析Json对象
val responseData = response.body?.string()//服务器返回的数据
responseJson = Gson().fromJson(responseData, DeviceResponseJson::class.java)//json对应的数据类
假设某一Json的格式是:
{
"error_code": 0,
"result": {
"totalNum": 2,
"deviceList": [
{
"role": 0,
"name":"hello"
"status": 0
},
{
"role": 0,
"name":"me"
"status": 0
}
],
"currentIndex": 1
}
}
那么对用的数据类为
data class DeviceResponseJson(
@SerializedName("error_code")
val code: Int,
@SerializedName("result")
val result: DevResult,
)
data class DevResult(
@SerializedName("totalNum")
val totalNum: Int,
@SerializedName("deviceList")
val deviceList: List<TapoDevice>,
@SerializedName("currentIndex")
val currentIndex: Int
)
//由于此处有数组,因此将deviceList的数据类型设置为List,泛型为自定义泛型
data class TapoDevice(
val role: Int,
val name: String
)
值得一提的是,我们不需要写下Json的所有字段,只需要写在类里面需要的字段即可。
val responseData = response.body?.string()
responseJson = Gson().fromJson(responseData, DeviceResponseJson::class.java)
val error_code = responseJson.error_code
if (error_code == 0) {
val total_num = responseJson.result.totalNum
val devListString : List<TapoDevice> = responseJson.result.deviceList
for (dev in devListString) {
Log.d("-z", "onResponse: ${dev.name}")
dev.deviceId
}