json是App进行网络通信最常见的数据交互格式,Android也自带了json格式的处理工具包org.json,该工具包主要提供了JSONObject(json对象)与JSONArray(json数组)的解析处理。下面分别介绍这两个工具类的用法:

1、JSONObject

JSONObject的常用方法如下所示:

构造函数 : 从指定字符串构造出一个JSONObject对象。

getJSONObject : 获取指定名称的JSONObject对象。

getString : 获取指定名称的字符串。

getInt : 获取指定名称的整型数。

getDouble : 获取指定名称的双精度数。

getBoolean : 获取指定名称的布尔数。

getJSONArray : 获取指定名称的JSONArray数组对象。

put : 添加一个JSONObject对象。

toString : 把当前JSONObject输出为一个json字符串。

2、JSONArray

JSONArray的常用方法如下所示:

length : 获取JSONArray数组对象的长度。

getJSONObject : 获取JSONArray数组对象在指定位置处的JSONObject对象。

put : 往JSONArray数组对象中添加一个JSONObject对象。

使用JSONObject和JSONArray对json串进行手工解析,处理过程比较常规,完成该功能的Kotlin代码与Java代码大同小异。下面直接给出Kotlin解析json串的常用代码片段,包括如何构造json串、如何解析json串,以及如何遍历json串:

//构造json串

private val jsonStr: String

get() {

val obj = JSONObject()

obj.put("name", "地址信息")

val array = JSONArray()

for (i in 0..2) {

val item = JSONObject()

item.put("item", "第${i+1}个元素")

array.put(item)

}

obj.put("list", array)

obj.put("count", array.length())

obj.put("desc", "这是测试串")

return obj.toString()

}

//解析json串

private fun parserJson(jsonStr: String?): String {

val obj = JSONObject(jsonStr)

var result = "name=${obj.getString("name")}\n" +

"desc=${obj.getString("desc")}\n" +

"count=${obj.getInt("count")}\n"

val listArray = obj.getJSONArray("list")

//util表示的范围是左闭右开区间。以下语句相当于for (i in 0..listArray.length() - 1)

for (i in 0 until listArray.length()) {

val item = listArray.getJSONObject(i)

result = "${result}\titem=${item.getString("item")}\n"

}

return result

}

//遍历json串

private fun traverseJson(jsonStr: String?): String {

var result = ""

val obj = JSONObject(jsonStr)

val it = obj.keys()

while (it.hasNext()) { // 遍历JSONObject

var key = it.next().toString()

result = "${result}key=$key, value=${obj.getString(key)}\n"

}

return result

}

前面提到Kotlin对json串的手工解析没有什么好办法,其实是有更高层次的办法。手工解析json串实在是麻烦,费时费力还容易犯错,所以好汉不吃眼前亏,此路难走不如另寻捷径,捷径便是甩开手工解析几条街的自动解析。

既然是自动解析,首先要制定一个规则,约定json串有哪些元素,具体对应怎样的数据结构;其次还得有个自动解析的工具,俗话说得好,没有金刚钻、不揽瓷器活。对于捷径第一要素的json数据结构定义,Kotlin特有的数据类正好派上用场了,字段名、字段类型、字段默认值等色香味俱全,还有equals、copy、toString等下酒小菜,只要开发者轻拉珠帘便是一大桌的满汉全席。到底有多么省事,且看下面的用户信息数据类,包括姓名、年龄、身高体重、婚否等字段存取在内的完整功能,仅需一行Kotlin代码就全部搞定了:

data class UserInfo(var name: String="", var age: Int=0, var height: Long=0L, var weight: Float=0F, var married: Boolean=false)

接着解决捷径第二要素的工具使用,json解析除了系统自带的org.json,谷歌公司也提供了一个增强库gson,专门用于json串的自动解析。不过由于是第三方库,因此首先要修改模块的build.gradle文件,在里面的dependencies节点下添加下面一行配置,表示导入指定版本的gson库:

compile "com.google.code.gson:gson:2.8.2"

其次还要在kt源码文件头部添加如下一行导入语句,表示后面会用到Gson工具类:

import com.google.gson.Gson

完成了以上两个步骤,然后就能在代码中调用Gson的各种处理方法了,Gson常用的方法有两个,一个名叫toJson,可把数据对象转换为json字符串;另一个名叫fromJson,可将json字符串自动解析为数据对象,方法调用的代码格式为“fromJson(json串, 数据类的类名::class.java)”。Kotlin的数据类定义代码尚且只有一行,这里的json串自动解析仍旧只需一行代码,实实在在为开发者节省了不少功夫。下面是个通过gson库实现json自动解析的Kotlin代码例子:

class JsonConvertActivity : AppCompatActivity() {

private val user = UserInfo(name="阿四", age=25, height=160L, weight=45.0f, married=false)

private val json = Gson().toJson(user)

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_json_convert)

btn_origin_json.setOnClickListener { tv_json.text = "json串内容如下:\n$json" }

btn_convert_json.setOnClickListener {

//利用Gson包直接将json串解析为对应格式的数据类对象

val newUser = Gson().fromJson(json, UserInfo::class.java)

tv_json.text = "从json串解析而来的用户信息如下:" +

"\n\t姓名=${newUser.name}" +

"\n\t年龄=${newUser.age}" +

"\n\t身高=${newUser.height}" +

"\n\t体重=${newUser.weight}" +

"\n\t婚否=${newUser.married}"

}

}

}

kotlin 读取json文件_Kotlin入门(31)JSON字符串的解析相关推荐

  1. 【C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解】

    文章目录 一.json文件简介 1.json文件 2.json与其他存储数据方式比较 二.C++操作json文件 1.jsoncpp 库下载 2.C++从字符串中读取json 1.简单json样式 2 ...

  2. C++ 之 C++ 操作 json 文件(C++读写json文件)及jsoncpp配置详解

    目录 前言 一.json文件简介 1.json文件 2.json与其他存储数据方式比较 二.C++操作json文件 1.jsoncpp 库下载 2.C++从字符串中读取json 3.C++从文件中读取 ...

  3. nodejs写入json文件,格式化输出json的方法

    将 JSON 对象写入文件. 使用 fs.writeFile(),模板字面量 和 JSON.stringify() 将 json 对象写入到 .json 文件中. 写入json文件后,都会出现很恶心的 ...

  4. matlab将txt数据分类,MATLAB读取txt文件,txt里面有字符串和数值两种类型

    MATLAB读取txt文件,txt里面有字符串和数值两种类型 mip版  关注:96  答案:4  悬赏:30 解决时间 2021-01-29 08:48 已解决 2021-01-28 15:04 M ...

  5. kotlin 读取json文件_Kotlin数据类及json解析

    通过数据类,可以方便地得到很多有趣的函数,一部分是来自属性,比如编写getter和setter函数,还有下面这些函数:equals(): 比较两个对象的属性来确保他们是相同的. hashCode(): ...

  6. Kotlin入门(31)JSON字符串的解析

    json是App进行网络通信最常见的数据交互格式,Android也自带了json格式的处理工具包org.json,该工具包主要提供了JSONObject(json对象)与JSONArray(json数 ...

  7. Java读取json文件,再生产新的json文件

    <!-- 阿里JSON解析器 --><dependency><groupId>com.alibaba</groupId><artifactId&g ...

  8. jackson Read 读取 json 文件和 Write 写入 json 文件 读写 json 文件

    jackson Read Write 读取 json 文件和写入 json 文件 jackson 可以由这里获得 http://repo1.maven.org/maven2/com/fasterxml ...

  9. Springboot读取.csv文件并转化为JSON对象

    有时候我们需要读取.csv文件并将其中的数据处理成json对象以便后续处理,在这里整理了简单的处理流程. 1. 代码实现 1)引入依赖 <dependency><groupId> ...

最新文章

  1. Zookeeper watch机制
  2. B - 娜娜梦游仙境系列——跳远女王
  3. 第十三周项目一-分数类中的运算符重载
  4. UA MATH571A QE练习 R语言 非参数回归 上
  5. Linux之CentOS用ifconfig没显示ip显示了inet6
  6. 关于restful协议很多人的误解
  7. 基于jquery的上传插件Uploadify 3.1.1在MVC3中的使用
  8. [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
  9. 【转】Linux中断处理学习笔记
  10. Ubuntu 12.10 正式发布
  11. springboot三层架构_几张图让你快速了解数据中台技术架构
  12. 组件与.NET互操作
  13. ORACLE EBS CUX用户的创建(转)
  14. SpringCloud Alibaba之Nacos组件
  15. 基本 SQL 之增删改查
  16. 计算机网络发展分几个阶段各有什么特点,计算机网络的发展可以划分为几个阶段?每个阶段都有什么特点?...
  17. linux 截屏_如何在Linux上截图
  18. 百度自动php推送蜘蛛怎么不来访问,使用代码向百度蜘蛛主动推送链接
  19. 静态代理的实现-模拟中介代理房东出租房子给房客
  20. c语言打造dnf游戏角色视频,主播DK:展示成果!打造20个武炼18个卢克C角色! - 地下城与勇士掌游宝...

热门文章

  1. jquery实现上拉加载
  2. ArcGIS空间统计—Moran‘s莫兰指数上
  3. max日期最大值为0_0-1背包问题和vivo运矿石问题
  4. android 逆向题目,SafeBox一道简单的安卓逆向题
  5. windows10强制删除文件_不用羡慕苹果系统,Windows 10也有这个功能了
  6. 平面设计笔记本电脑,学平面设计用什么电脑好
  7. Understanding REST
  8. 在篮球运动中,领先多少分才安全。体育作家Bill 开发了一个算法,用于判断篮球比赛中怎样的领先优势是不可超越的
  9. 什么是前端模块化,组件化,工程化?
  10. 支付宝和天弘独家合作 基金公司淘宝开店热降温