咱们以前已经掌握了 XML 格式数据的解析方式,那么接下来咱们要去学习一下如何解析 JSON 格式的数据,在学习以前,咱们先将这二者作一个简单的比较。编程
XML与JSON的对比:
- JSON和XML的数据可读性基本相同
- JSON和XML一样拥有丰富的解析手段
- JSON相对于XML来说,数据的体积小
- JSON与JavaScript的交互更加方便
- JSON对数据的描述性比XML较差
- JSON的速度要远远快于XML
总之,比起 XML, JSON 的主要优点在于它的体积更小,在网络上传输的时候能够更省流量。但缺点在于,它的语义性较差,看起来不如 XML 直观。json
就像协议同样,JSON 也是有一套规范的,毕竟服务端和客户端双方通常来说都是经过 JSON 字符串来传递数据的。数组
它的语法规则以下:网络
- 数据在“名称/值”对中;
- 数据由逗号分隔;
- 花括号保存对象;
- 方括号保存数组;
[ { "id":"1","name":"WGH","age":"18" }, { "id":"2","name":"WillFlow","age":"16" } ]
咱们除了解析JSON还能够本身拼接JSON,固然若是你本身拼了一个JSON字符串又不知道对不对, 能够用校验工具进行校验,好比:点击这里,而后把本身拼接的JSON字符串贴上去,就能够校验正确与否了。app
这些JSON解析类的API都存在于org.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 程序中解析这些数据。ide
@Override protected 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() 方法将这些数据取出,并打印出来便可。工具
如何你认为使用 JSONObject 来解析 JSON 数据已经很是简单了,那你就太容易知足了。谷歌提供的 GSON 开源库可让解析 JSON 数据的工做简单到让你不敢想象的地步,那咱们确定是不能错过这个学习机会的。学习
dependencies { ...... compile 'com.google.code.gson:gson:2.8.1' }
这时候GSON框架就加载好了,咱们须要手动同步一下。this
完成以后重启 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());
基本的用法就是这样,下面就让咱们来真正地尝试一下。
[ {"id":"1","version":"1.5","name":"Apple"}, {"id":"2","version":"1.6","name":"WillFlow"}, {"id":"3","version":"1.7","name":"WGH"} ]
/** * Created by : WGH. */ public class 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解析的必须)。
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, "————————————————————"); } }
而后调用输出便可。
这样咱们就就把 XML 和 JSON 这两种数据格式最经常使用的几种解析方法都学习完了,在网络数据的解析方面,咱们已经成功毕业了。