美文网首页
kotlin的Gson的使用

kotlin的Gson的使用

作者: 年小个大 | 来源:发表于2019-04-17 20:44 被阅读0次
    首先你得先加入依赖库 '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
        }
    
    }
    

    相关文章

      网友评论

          本文标题:kotlin的Gson的使用

          本文链接:https://www.haomeiwen.com/subject/ffuowqtx.html