转载: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 数据详解(转)相关推荐

  1. java解析json数据_java解析JSON数据详解

    JSON是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java语言中解析json数据的 ...

  2. Android 使用Gson解析json案例详解

    一.目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https:// ...

  3. android json格式解析,android之解析json数据格式详解

    1.JSON解析 (1).解析Object之一: 解析方法: 1 JSONObject demoJson =newJSONObject(jsonString); 2 String url = demo ...

  4. gson解析php,php,android_关于 Gson 解析JSON数据。。。,php,android - phpStudy

    关于 Gson 解析JSON数据... 1.首先,我是从服务器端传回来的JSON数据如下: {"info":"succeed","user_id&qu ...

  5. Android利用Gson解析Json数据

    其实,要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个 ...

  6. Gson解析JSON数据中动态未知字段key的方法

    转载自:https://blog.csdn.net/jdsjlzx/article/details/76785239 有时在解析json数据中的字段key是动态可变的时候,由于Gson是使用静态注解的 ...

  7. Okhttp源码分析以及Google Gson解析json数据实例

    Okhttp Github的Okhttp OkHttp是一个高效的HTTP客户端,它有以下默认特性: 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接 透明的GZIP压缩减少响 ...

  8. Android中Gson解析json数据使用@SerializedName注解

    @SerializedName 此注解作用在属性上,表明这个属性在序列化成Json的时候,需要将名字序列化成注解的value属性指定的值. 我们有一段json数据如下: { "id" ...

  9. 用Google提供的Gson解析JSON数据

    2019独角兽企业重金招聘Python工程师标准>>> 解析Json也就是触类旁通的一个过程,废话不说,比如我们要解析一个下面这种的Json,我们用的是Google的一个开源Gson ...

最新文章

  1. ASimpleCache 轻量级缓存
  2. 微信公众号开发小记——4.两种邀请用户的方式 扫码链接
  3. 2014百度研发真题及其解析-求比指定数大且最小的“不重复数”
  4. PHP服务器环境打开配置文件
  5. Java开发人员在编程中常见的雷!
  6. 拓扑排序基础题——排序
  7. CSDN-markdown编辑器使用说明
  8. php foreach ,PHP学习之foreach循环时加符号的说明
  9. 自动手动安装CDH5
  10. centos6.5 gcc升级至4.8
  11. 0CTF 2016 RSA?(未完成)
  12. HDU 4585 Shaolin (STL)
  13. 用html做自我介绍
  14. 三年前,我差点成了爬虫大师
  15. 你不知道的浏览器页面渲染机制
  16. 这平安夜,我们来用python演奏一首铃儿响叮当吧
  17. Java安装WindowBuilder
  18. tensorRT onnx中属性名相同,但实际大小不同生成问题
  19. 推动外部董事高效履职,提高国资国企治理能力
  20. 计算机夯实基础学习顺序

热门文章

  1. 分析jQuery源码时记录的一点感悟
  2. 让 Windows 7 定时待机
  3. SQL CE 3.0 与SQL CE 3.5区别
  4. OpenGL编程轻松入门(一)
  5. 云计算与springCloud概念上的区别
  6. 海外高校毕业证的颜色
  7. String、String Buffer、StringBuilder区别与比较
  8. Django-HttpResponse、render,、redirect(转载)
  9. 根据数据集获取概率密度图像和概率分布图像
  10. stanford python中文分词