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

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: [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())
 }
目录
相关文章
|
12天前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
33 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
4天前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin中常见作用域函数
**Kotlin作用域函数概览**: `let`, `run`, `with`, `apply`, `also`. `let`安全调用并返回结果; `run`在上下文中执行代码并返回结果; `with`执行代码块,返回结果; `apply`配置对象后返回自身; `also`附加操作后返回自身
21 8
|
12天前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
57 15
|
7天前
|
安全 Java Android开发
探索Android应用开发中的Kotlin语言
【7月更文挑战第19天】在移动应用开发的浩瀚宇宙中,Kotlin这颗新星以其简洁、安全与现代化的特性,正迅速在Android开发者之间获得青睐。从基本的语法结构到高级的编程技巧,本文将引导读者穿梭于Kotlin的世界,揭示其如何优化Android应用的开发流程并提升代码的可读性与维护性。我们将一起探究Kotlin的核心概念,包括它的数据类型、类和接口、可见性修饰符以及高阶函数等特性,并了解这些特性是如何在实际项目中得以应用的。无论你是刚入门的新手还是寻求进阶的开发者,这篇文章都将为你提供有价值的见解和实践指导。
|
9天前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
19 6
|
8天前
|
存储 前端开发 测试技术
Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
使用Kotlin实现MVVM模式是Android开发的现代实践。该模式分离UI和业务逻辑,借助LiveData、ViewModel和DataBinding增强代码可维护性。步骤包括创建Model层处理数据,ViewModel层作为数据桥梁,以及View层展示UI。添加相关依赖后,Model类存储数据,ViewModel类通过LiveData管理变化,而View层使用DataBinding实时更新UI。这种架构提升代码可测试性和模块化。
43 2
|
12天前
|
存储 API Android开发
kotlin开发安卓app,使用webivew 触发 onShowFileChooser, 但只能触发一次,第二次无法触发,是怎么回事。 如何解决
在Android WebView开发中,`onShowFileChooser`方法用于开启文件选择。当用户只能选择一次文件可能是因为未正确处理选择回调。解决此问题需确保:1) 实现`WebChromeClient`并覆写`onShowFileChooser`;2) 用户选择文件后调用`ValueCallback.onReceiveValue`传递URI;3) 传递结果后将`ValueCallback`设为`null`以允许再次选择。下面是一个Kotlin示例,展示如何处理文件选择和结果回调。别忘了在Android 6.0+动态请求存储权限,以及在Android 10+处理分区存储。
|
14天前
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;
|
10天前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式有哪些用法
Kotlin的Lambda表达式是匿名函数的简洁形式,常用于集合操作和高阶函数。基本语法是`{参数 -&gt; 表达式}`。例如,`{a, b -&gt; a + b}`是一个加法lambda。它们可在`map`、`filter`等函数中使用,也可作为参数传递。单参数时可使用`it`关键字,如`list.map { it * 2 }`。类型推断简化了类型声明。
10 0
|
10天前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
**Kotlin中的匿名函数与Lambda表达式概述:** 匿名函数(`fun`关键字,明确返回类型,支持非局部返回)适合复杂逻辑,而Lambda(简洁语法,类型推断)常用于内联操作和高阶函数参数。两者在语法、返回类型和使用场景上有所区别,但都提供无名函数的能力。
10 0