JSONObject 和 GSON 解析 JSON 数据详解(转)
转载:http://www.jianshu.com/p/f99de3ec0636
点此进入:从零快速构建APP系列目录导图
点此进入:UI编程系列目录导图
点此进入:四大组件系列目录导图
点此进入:数据网络和线程系列目录导图
本节例程下载地址:WillFLowJSON
一、JSON简介
我们之前已经掌握了 XML 格式数据的解析方式,那么接下来我们要去学习一下如何解析 JSON 格式的数据,在学习之前,我们先将这两者做一个简单的比较。
XML与JSON的对比:
- JSON和XML的数据可读性基本相同
- JSON和XML同样拥有丰富的解析手段
- JSON相对于XML来讲,数据的体积小
- JSON与JavaScript的交互更加方便
- JSON对数据的描述性比XML较差
- JSON的速度要远远快于XML
总之,比起 XML, JSON 的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如 XML 直观。
(1)JSON 的格式规范
就像协议一样,JSON 也是有一套规范的,毕竟服务端和客户端双方一般来讲都是通过 JSON 字符串来传递数据的。
它的语法规则如下:
- 数据在“名称/值”对中;
- 数据由逗号分隔;
- 花括号保存对象;
- 方括号保存数组;
(2)JSON数据的书写格式范例
[{ "id":"1","name":"WGH","age":"18" },{ "id":"2","name":"WillFlow","age":"16" }
]
(3)JSON校验工具
我们除了解析JSON还可以自己拼接JSON,当然如果你自己拼了一个JSON字符串又不知道对不对, 可以用校验工具进行校验,比如:点击这里,然后把自己拼接的JSON字符串贴上去,就可以校验正确与否了。
(4)Android给我们提供的JSON解析类
这些JSON解析类的API都存在于org.json包下,而我们用到的类有下面这些:
- JSONObject: JSON对象,可以完成Json字符串与Java对象的相互转换
- JSONArray: JSON数组,可以完成Json字符串与Java集合或对象的相互转换
- JSONStringer: JSON文本构建类,这个类可以帮助快速和便捷的创建JSON text, 每个JSONStringer实体只能对应创建一个JSON text
- JSONTokener:JSON解析类
- JSONException:JSON异常
二、用 JSONObject 解析 JSON 格式数据
首先在MainActivity中定义一个JSON 字符串常量,代码如下:
private static final String JSON = "[\n" +" {\"id\":\"1\",\"version\":\"1.5\",\"name\":\"Apple\"},\n" +" {\"id\":\"2\",\"version\":\"1.6\",\"name\":\"WillFlow\"},\n" +" {\"id\":\"3\",\"version\":\"1.7\",\"name\":\"WGH\"}\n" +"]";
这样我们就把 JSON 格式的数据准备好了,下面就开始在 Android 程序中解析这些数据。
修改 MainActivity 中的代码,如下所示:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);parseJSONWithJSONObject(JSON);}private void parseJSONWithJSONObject(String jsonData) {try {JSONArray jsonArray = new JSONArray(jsonData);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject = jsonArray.getJSONObject(i);String id = jsonObject.getString("id");String name = jsonObject.getString("name");String version = jsonObject.getString("version");Log.i(TAG, "id : " + id);Log.i(TAG, "name : " + name);Log.i(TAG, "version : " + version);Log.i(TAG, "————————————————————");}} catch (Exception e) {e.printStackTrace();}}
可以看到,解析 JSON 的代码真的是非常简单,由于我们定义的是一个 JSON 数组,因此这里首先是将数据传入到了一个 JSONArray 对象中,然后循环遍历这个 JSONArray,从中取出的每一个元素都是一个 JSONObject 对象,每个 JSONObject 对象中又会包含 id、 name 和 version 这些数据。接下来只需要调用 getString() 方法将这些数据取出,并打印出来即可。
编译运行查看日志数出
三、用 GSON 解析 JSON 格式数据
如何你认为使用 JSONObject 来解析 JSON 数据已经非常简单了,那你就太容易满足了。谷歌提供的 GSON 开源库可以让解析 JSON 数据的工作简单到让你不敢想象的地步,那我们肯定是不能错过这个学习机会的。
首先,在Gradle中配置如下依赖:
dependencies {......compile 'com.google.code.gson:gson:2.8.1'
}
这时候GSON框架就加载好了,我们需要手动同步一下。
如果你的 Android Studio 中没有安装GSON插件的话,可以这样安装:
完成之后重启 Android Studio 即可。
那么 GSON 库究竟是神奇在哪里呢?其实它主要就是可以将一段 JSON格式的字符串自动映射成一个对象,从而不需要我们再手动去编写代码进行解析了,比如说一段 JSON 格式的数据如下所示:
{"name":"Tom","age":20}
那我们就可以定义一个 Person 类,并加入 name 和 age 这两个字段,然后只需简单地调用如下代码就可以将 JSON 数据自动解析成一个 Person 对象了:
Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);
如果需要解析的是一段 JSON 数组会稍微麻烦一点,我们需要借助 TypeToken 将期望解析成的数据类型传入到 fromJson() 方法中,如下所示:
List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
基本的用法就是这样,下面就让我们来真正地尝试一下。
这里我们首先准备好需要解析的JSON原始数据:
[{"id":"1","version":"1.5","name":"Apple"},{"id":"2","version":"1.6","name":"WillFlow"},{"id":"3","version":"1.7","name":"WGH"}
]
然后新建一个AppBean类,用于数据规范的定义:
/*** Created by : WGH.*/
public class AppBean {}
然后在该类的任意位置“Alt + Insert”,然后选择“Gson Format”或者使用快捷键“Alt + S”
然后会出现这样的界面,然后把我们刚才的JSON原始数据粘贴进去后点击OK:
继续点击OK,你会发现此时的AppBean变成了这个样子:
/*** Created by : WGH.*/
public class AppBean {/*** id : 1* version : 1.5* name : Apple*/private String id;private String version;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getVersion() {return version;}public void setVersion(String version) {this.version = version;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
这是一个包含了id、 name 和 version 这三个字段的数据类,并且成员变量和JSON原始数据的Key值完全相同(这点尤为重要,这是采用GSON解析的必须)。
最后在 MainAcitivyt 中定义这样的方法:
private void parseByGSON(String jsonData) {Gson gson = new Gson();List<AppBean> appList = gson.fromJson(jsonData, new TypeToken<List<AppBean>>() {}.getType());for (AppBean app : appList) {Log.i(TAG, "id : " + app.getId());Log.i(TAG, "name : " + app.getName());Log.i(TAG, "version : " + app.getVersion());Log.i(TAG, "————————————————————");}}
然后调用输出即可。
编译运行查看Log输出
这样我们就就把 XML 和 JSON 这两种数据格式最常用的几种解析方法都学习完了,在网络数据的解析方面,我们已经成功毕业了。
转载于:https://www.cnblogs.com/benchao/p/7613765.html
JSONObject 和 GSON 解析 JSON 数据详解(转)相关推荐
- java解析json数据_java解析JSON数据详解
JSON是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java语言中解析json数据的 ...
- Android 使用Gson解析json案例详解
一.目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https:// ...
- android json格式解析,android之解析json数据格式详解
1.JSON解析 (1).解析Object之一: 解析方法: 1 JSONObject demoJson =newJSONObject(jsonString); 2 String url = demo ...
- gson解析php,php,android_关于 Gson 解析JSON数据。。。,php,android - phpStudy
关于 Gson 解析JSON数据... 1.首先,我是从服务器端传回来的JSON数据如下: {"info":"succeed","user_id&qu ...
- Android利用Gson解析Json数据
其实,要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个 ...
- Gson解析JSON数据中动态未知字段key的方法
转载自:https://blog.csdn.net/jdsjlzx/article/details/76785239 有时在解析json数据中的字段key是动态可变的时候,由于Gson是使用静态注解的 ...
- Okhttp源码分析以及Google Gson解析json数据实例
Okhttp Github的Okhttp OkHttp是一个高效的HTTP客户端,它有以下默认特性: 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接 透明的GZIP压缩减少响 ...
- Android中Gson解析json数据使用@SerializedName注解
@SerializedName 此注解作用在属性上,表明这个属性在序列化成Json的时候,需要将名字序列化成注解的value属性指定的值. 我们有一段json数据如下: { "id" ...
- 用Google提供的Gson解析JSON数据
2019独角兽企业重金招聘Python工程师标准>>> 解析Json也就是触类旁通的一个过程,废话不说,比如我们要解析一个下面这种的Json,我们用的是Google的一个开源Gson ...
最新文章
- ASimpleCache 轻量级缓存
- 微信公众号开发小记——4.两种邀请用户的方式 扫码链接
- 2014百度研发真题及其解析-求比指定数大且最小的“不重复数”
- PHP服务器环境打开配置文件
- Java开发人员在编程中常见的雷!
- 拓扑排序基础题——排序
- CSDN-markdown编辑器使用说明
- php foreach ,PHP学习之foreach循环时加符号的说明
- 自动手动安装CDH5
- centos6.5 gcc升级至4.8
- 0CTF 2016 RSA?(未完成)
- HDU 4585 Shaolin (STL)
- 用html做自我介绍
- 三年前,我差点成了爬虫大师
- 你不知道的浏览器页面渲染机制
- 这平安夜,我们来用python演奏一首铃儿响叮当吧
- Java安装WindowBuilder
- tensorRT onnx中属性名相同,但实际大小不同生成问题
- 推动外部董事高效履职,提高国资国企治理能力
- 计算机夯实基础学习顺序