首先你得先加入依赖库 'com.google.code.gson:gson:2.8.5'
一:没有数据头的纯属组Json解析
[
{
"name": "zhangsan",
"age": "10",
"phone": "11111",
"email": "11111@11.com"
},
{
"name": "lisi",
"age": "20",
"phone": "22222",
"email": "22222@22.com"
},
...
]
1 .需要一个Bean对象。
data class UserBean(
val name:String,
val age:String,
val phone:Strin,
val emall:String,
)
2.开始解析 只需要3部分
fun parseNoHeaderJArray(){
//**********Json数据*************
//这里假设数据是从user.json中获取 具体实现最方代码
val userJson=UserApi.instance.getOriginalFunData(this)
//这里又假设数据是送本地拿到
val userJson=JsonToStringUtil.getStringByJson(this, R.raw.juser_1)
//**********JsonArray对象*************
//关键 json的数据解析对象 JsonParser
val parser=JsonParser()
//将Json字符串转换成JsonArray对象
val JsonArray=parser.parser(userJson).asJsonArray
//**********Gson进行数据解析与合并*************
//Gson
val gson=Gson()
val userList=mutableListOf<UserBean>()
//将数据添加到userList中
for(user : jsonArray){
val userBean=gson.fromJson(user,UserBean::class.java)
userList.add(userBean)
}
println(userList)
}
二:有数据头的纯数据数组数据解析
{
"muser": [
{
"name": "zhangsan",
"age": "10",
"phone": "11111",
"email": "11111@11.com"
},
{
"name": "lisi",
"age": "20",
"phone": "22222",
"email": "22222@22.com"
},
...
]
}
解析过程
fun parseHaveHeaderJArray() {
val cuerJson = CityApi.instance.getOriginalFundData(this)
//先转换成JsonObject
val jsonObject = sonParser().parse(userJson).asJsonObject
//再转JsonArray 加上数据头
val jsonArray = jsonObject.getAsJsonArray("muser")
val gson = Gson()
val userList = mutableListOf<UserBean>()
//添加数据
for (user in jsonArray) {
//通过TypeToken 反射的方式拿到数据类
val userBean =
gson.fromJson<UserBean>(
user,
object : TypeToken<UserBean>() {}.type)
userList.add(userBean)
}
print(userList)
}
总结:
1.与第一种类似,不同的是在获取到JsonArrary后
再从JsonArrary中拿到key:muser的值getAsJsonArray(“muser”)
2.在解析数据的时候通过TypeToken反射拿到数据类 这是一个匿名内部类
作用就是获取像list这样的泛型信息。自行脑补
三:有数据头的复杂数
{
"code": 200,
"msg": "OK",
"muser": [
{
"name": "zhangsan",
"age": "10",
"phone": "11111",
"email": "11111@11.com"
},
{
"name": "lisi",
"age": "20",
"phone": "22222",
"email": "22222@22.com"
},
...
]
}
根据json的数据格式建立实体类,这里的实体类是包含所有字段,Gson能直接解析成List
so:Bean这样写 由两个data类组成 如果UserBean中还有List<OtherBean> 同样建立一个OtherBean data类 所有的类都可以写在一个.kt文件中
data class ResultBean(
val code:Int,
val msg:String,
val muser:List<UserBean>
)
data class UserBean(
val name:String,
val age:String,
val phone:String,
val email:String
)
现在看一下Gson是如何解析的把
fun parseHaveHeaderJArray() {
//拿到json的字符串
val resultJson=CityApi.instance.getOriginalFundData(this)
//直接Gson解析
val resultBean=
Gson().fromJson(resultJson,ResultBean::class.java)
//拿到对象集合
val userBeanList=resultBean.muser
//就这么简单
print(userBeanList)
}
这种方式是最简单的
这几种方式差不多能应对所有的Json的数据类型了
还有其他内容更多更复杂的数据就不一一列举了。
如和从**.json文件中获取数据:
从assets文件夹中获取.json的文件转换成字符串
class UserApi private constructor() {
//以单例的模式来进行引用
companion object {
val instance = UserApi()
}
fun getOriginalFundData(context: Context): String? {
var inputStream: InputStream? = null
try {
inputStream = context.assets.open("user.json")
return convertStreamToString(inputStream) as String
} catch (e: Exception) {
e.printStackTrace()
}
return null
}
/**
* input 流转换为字符串
*/
fun convertStreamToString(input: InputStream): String? {
var s: String? = null
try {
//格式转换
val scanner = Scanner(input, "UTF-8")
.useDelimiter("\\A")
if (scanner.hasNext()) {
s = scanner.next()
}
input.close()
} catch (e: IOException) {
e.printStackTrace()
}
return s
}
}