Android开发中,与服务器交互80%是通过JSON方式传输数据,JSON也是基于纯文本的数据格式,JSON具有跨平台的优势,相对XML,JSON解析起来更方便,简单,解析数据所消耗的流量也会比XML少,而且JSON有一些好的第三方库文件,已为开发者封装好了。
JSON语法规则:
-
数据在名称/值对中
-
数据由逗号分隔
-
花括号保存对象
-
方括号保存数组
JSON 名称/值对
JSON 数据的书写格式是:名称/值对
名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:比如;"firstName":"John"
JSON 值
-
数字(整数或浮点数)
-
字符串(在双引号中)
-
逻辑值(true 或 false)
-
数组(在方括号中)
-
对象(在花括号中)
-
null
比如值是基本类型
- {"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
{}代表是一个对象,这些都是简单的key/value形式,如果用对象来表示的话:
- public class Info {
- public String city;
- public String street;
- public int postcode;
- }
在这个JavaBean中并没有使用get,set方法,因为get,set方法是使用反射做的,比较慢,这是JSON最简单的方式,key/value形式,我们知道json有三种方式,一种是key/value,key/Object,key/array,现在讲讲key/Object形式:
比如:
- {"name":"Michael","address":{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}}
这里有2个对象,一个是最外面的,一个是address:它也是一个对象,我们说了{}就代表一个对象,因此 首先写里面的对象,然后再写外面的对象,代码如下:
Info.java
- package com.jackie.json;
- public class Info {
- public String city;
- public String street;
- public int postcode;
- }
Person.java
- /**
- * {"name":"Michael","address":{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}}
- * @author carpool
- *
- */
- public class Person {
- public String name;
- public Info info;
- }
JSON解析代码:
- </pre><pre class="java" name="code">String jsonString = getJsonString();
- try {
- JSONObject jb = new JSONObject(jsonString); //最先解析最外层的{}
- Person p = new Person();
- Info info = new Info();
- info.city = jb.getJSONObject("address").getString("city");
- info.street = jb.getJSONObject("address").getString("street");
- info.postcode = jb.getJSONObject("address").getInt("postcode");
- p.info = info;
- p.name = jb.getString("name");
- } catch (JSONException e) {
- e.printStackTrace();
- }
现在还剩下一个种形式JSON,就是key/array,比如:
- {
- "people": [
- {
- "firstName": "Brett",
- "lastName": "McLaughlin",
- "email": "aaaa"
- },
- {
- "firstName": "Jason",
- "lastName": "Hunter",
- "email": "bbbb"
- },
- {
- "firstName": "Elliotte",
- "lastName": "Harold",
- "email": "cccc"
- }
- ]
- }
我们知道{}代表的是一个对象,[]代表的是数组,表示数组中存放了很多对象,对象之间用逗号(,)分开,
这个用对象封装一般有二种形式,一是直接用集合把解析的对象存储起来,二是用一个类封装一个集合,集合的对象就是上面所解析的对象即可
第一种方式:
People.java
- public class People {
- public String firstName;
- public String lastName;
- public String email;
- }
解析:
- String jsonString = getJsonString(); //JSON串
- try {
- JSONObject jb = new JSONObject(jsonString); //最先解析最外层的{}
- JSONArray ja = jb.getJSONArray("people");
- ArrayList<People> ps = new ArrayList<People>();
- for(int i = 0; i < ja.length(); i++){
- People p = new People();
- p.email = ja.getJSONObject(i).getString("email");
- p.firstName = ja.getJSONObject(i).getString("firstName");
- p.lastName = ja.getJSONObject(i).getString("lastName");
- ps.add(p);
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
第二种写法:
- public class MultiplePeople {
- public List<People> peoples;
- }
- String jsonString = getJsonString();//json串
- try {
- JSONObject jb = new JSONObject(jsonString);
- JSONArray ja = jb.getJSONArray("people");
- MultiplePeople multiplePeople = new MultiplePeople();
- List<People> ps = new ArrayList<People>();
- for(int i = 0; i < ja.length(); i++){
- People p = new People();
- p.email = ja.getJSONObject(i).getString("email");
- p.firstName = ja.getJSONObject(i).getString("firstName");
- p.lastName = ja.getJSONObject(i).getString("lastName");
- ps.add(p);
- }
- multiplePeople.peoples = ps;
- } catch (JSONException e) {
- e.printStackTrace();
- }