[Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换

简介: [Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换



1.JSON是什么?

  • JSON(JavaScript Object Notation)是一种轻量级的数据交换格式
  • 本质就是具有特定格式的字符串
  • JSON数据已经是客户端与服务端交互的最常用的选择,已经很少使用xml来进行数据交互了

JSON比起XML的优势和缺点:

优势:JSON的体积更小,在网络上传输的时候更省流量。

缺点:语义性较差,看起来不如XML直观。

如何获得JSON格式的数据

对于刚开始学习JSON的朋友,总会遇到一个问题:如何获得JSON格式的数据,如果你现在有同样的问题,可以试试看我的另一篇博客http://t.csdn.cn/JNaXQ里面有详细的介绍。

2.JSON数据格式

  • 整体结构

          Json数组:[]

          Json对象:{}

  • Json数组的结构:[value1,value2,value3]
  • Json对象的结构:{key1:value1,key2:value2,key3:value3}
  • key的数据类型:字符串
  • value的数据类型

           数值  字符串 null  json数组 json对象

  • 例子

       [1,"abcd",[{"a",1}],{"b":2,"c":[]}]

3.相关API

1.JSONObject:

  • JsonObject:json对象{}

          JSONObject( json:String):将json字符串解析为json对象

          Xxx.getXxx(name:String):根据name,在json对象中得到对应的Value

  • JsonArray:json数组[]

      JSONArray(json:String ):将json字符串解析为json数组

       length():得到json数组中元素的个数

       Xxx.getJSONObject(index:int ):根据下标得到json数组中对应的元素数据

  2.Gson

  • Gson:能解析json数据的类

      Gson():构造对象的方法

      toJson(src:Object):将对象转换为对应格式的json字符串

      fromJson(json:String,typeOfT:Type):T:解析JSon字符串,得到对象

  • TypeToken<T>:用来得到Type的类

      protected TypeToken():受保护的构造方法

      getType():Type:得到类型对象

 4.使用JSONObject

json格式的字符串{}转换为kotlin对象

1.将json字符串封装成JSONObject对象

2.从对象中根据key得到对应的value

private fun JsonToObject(jsonData:String){
        try {
            //1.将json字符串封装成JSONObject对象
            val jsonObject:JSONObject= JSONObject(jsonData)
            //2.从对象中根据key得到对应的value
            val id:Int=jsonObject.getInt("id")
            val name:String=jsonObject.getString("name")
            val price:Double=jsonObject.getDouble("price")
            val imagePath:String=jsonObject.getString("imagePath")
            Log.d("data","id is $id")
            Log.d("data","name is $name")
            Log.d("data","price is $price")
            Log.d("data","imagePath is $imagePath")
        }catch (e:Exception){
            e.printStackTrace()
        }
}

json格式的字符串[]转换为kotlin对象的List

1.将json字符串包装JSONArray对象

2.遍历JSONArray对象所以元素(JSONObject),并将每个元素封装为shopInfo,并添加到List

private fun JsonToList(jsonData:String){
        try {
            val list= ArrayList<ShopInfo>()
            //1.将json字符串包装JSONArray对象
            val jsonArray= JSONArray(jsonData)
            //2.遍历JSONArray对象所以元素(JSONObject),并将每个元素封装为shopInfo,
             //并添加到List
            for(i in 0 until jsonArray.length()){
                val jsonObject=jsonArray.getJSONObject(i)
                //从对象中根据key得到对应value
                val id:Int=jsonObject.getInt("id")
                val name:String=jsonObject.getString("name")
                val price:Double=jsonObject.getDouble("price")
                val imagePath:String=jsonObject.getString("imagePath")
                Log.d("data","id is $id")
                Log.d("data","name is $name")
                Log.d("data","price is $price")
                Log.d("data","imagePath is $imagePath")
                list.add(ShopInfo(id,name,price,imagePath))
            }
        }catch (e:Exception) {
            e.printStackTrace()
        }
}

5.使用GSON

要先添加依赖

implementation 'com.google.code.gson:gson:2.8.5'

json格式的字符串{}转换为kotlin对象

private fun JsonToObjectGson(jsonData:String){
        val gson=Gson()
        val shopInfo=gson.fromJson(jsonData,ShopInfo::class.java)
 }

json格式的字符串[]转换为kotlin对象的List

private fun JsonToListGson(jsonData:String){
        val gson=Gson()
        val typeOf=object:TypeToken<List<ShopInfo>>(){}.type
        val list=gson.fromJson<List<ShopInfo>>(jsonData,typeOf)
        for (a in list){
            Log.d("data","id is $a.id")
            Log.d("data","name is $a.name")
            Log.d("data","price is $a.price")
            Log.d("data","imagePath is $a.imagePath")
        }
    }

kotlin对象转换为json字符串{}

private fun ObjectToJson(){
        val info:ShopInfo= ShopInfo(4,"小名",11.0,"http://www.ddd.com")
        val json:String=Gson().toJson(info)
        Log.d("data",json)
    }

kotlin对象的List转换为json字符串[]

private fun ListToJson(){
        val list=ArrayList<ShopInfo>()
        list.add(ShopInfo(4,"小名",11.0,"http://www.ddd.com"))
        list.add(ShopInfo(5,"小星",21.0,"http://www.eee.com"))
        val json:String=Gson().toJson(list)
        Log.d("data",json)
 }

6.使用Map封装json对象key特别情况

当json对象的key不符合变量的命名法则,比如:my name(变量中有空格)或者2,无法在ShopInfo类中添加这个成员变量,该怎么解决?

我们可以把json对象转换成Map

private fun JsonToMap(jsonString:String) {
        val json=Gson()
        val typeOf=object :TypeToken<Map<String,Objects>>(){}.type
       val map:Map<String,Objects> = json.fromJson(jsonString,typeOf)
        Log.d("data",map.toString())
 }
目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1385 4
|
4月前
|
JSON 中间件 Java
【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
257 3
|
7月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
505 11
|
8月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
386 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
9月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
2343 2
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
820 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
JSON 人工智能 算法
探索大型语言模型LLM推理全阶段的JSON格式输出限制方法
本篇文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
1988 48
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
2809 52
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
799 0
在Java中处理JSON数据:Jackson与Gson库比较