json解析之Gson详解

什么是JSON:

JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被采用的客户端和服务端交互的解决方案.

JSON对象: 

JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huiLongGuan", "city":"beijing", "country":"china"}}. JSON对象的key只能是string类型的, 而value可以是string, number, false, true, null, Object对象甚至是array数组, 也就是说可以存在嵌套的情况.

JSON数组: 

JSON数组(array)以"["开始, 以"]"结束, 数组中的每一个元素可以是string, number, false, true, null, Object对象甚至是array数组, 数组间的元素使用逗号分隔. 如["coolxing", 24, {"street":"huiLongGuan", "city":"beijing", "country":"china"}].

JSON数据的解析:

解析JSON数据, 首先需要明确待解析的是JSON Object还是JSON array, 然后需要确定采用哪种解析技术. android平台上一般有2种解析技术可供选择:android内置的org.json包和google的开源gson库. 以下将分别采用这两种技术解析JSON对象和JSON数组.


1.  采用android内置的org.json包解析JSON对象. 假设待解析的JSON数据为json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 其中\用于转义表达式中的双引号. 首先定义2个JavaBean:

[java]  view plain  copy
  1. package text.com.bean;  
  2.   
  3. public class Address {  
  4.     private String street;  
  5.     private String city;  
  6.     private String country;  
  7.   
  8.     public Address() {  
  9.         super();  
  10.     }  
  11.   
  12.     public Address(String street, String city, String country) {  
  13.         super();  
  14.         this.street = street;  
  15.         this.city = city;  
  16.         this.country = country;  
  17.     }  
  18.   
  19.     public String getStreet() {  
  20.         return street;  
  21.     }  
  22.   
  23.     public void setStreet(String street) {  
  24.         this.street = street;  
  25.     }  
  26.   
  27.     public String getCity() {  
  28.         return city;  
  29.     }  
  30.   
  31.     public void setCity(String city) {  
  32.         this.city = city;  
  33.     }  
  34.   
  35.     public String getCountry() {  
  36.         return country;  
  37.     }  
  38.   
  39.     public void setCountry(String country) {  
  40.         this.country = country;  
  41.     }  
  42.   
  43.     @Override  
  44.     public String toString() {  
  45.         return "Address [street=" + street + ", city=" + city + ", country="  
  46.                 + country + "]";  
  47.     }  
  48.   
  49. }  

[java]  view plain  copy
  1. package text.com.bean;  
  2.   
  3. public class Person {  
  4.     private String name;  
  5.     private int age;  
  6.     private boolean male;  
  7.     private Address address;  
  8.   
  9.     public Person() {  
  10.         super();  
  11.     }  
  12.   
  13.     public Person(String name, int age, boolean male, Address address) {  
  14.         super();  
  15.         this.name = name;  
  16.         this.age = age;  
  17.         this.male = male;  
  18.         this.address = address;  
  19.     }  
  20.   
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.   
  25.     public void setName(String name) {  
  26.         this.name = name;  
  27.     }  
  28.   
  29.     public int getAge() {  
  30.         return age;  
  31.     }  
  32.   
  33.     public void setAge(int age) {  
  34.         this.age = age;  
  35.     }  
  36.   
  37.     public boolean isMale() {  
  38.         return male;  
  39.     }  
  40.   
  41.     public void setMale(boolean male) {  
  42.         this.male = male;  
  43.     }  
  44.   
  45.     public Address getAddress() {  
  46.         return address;  
  47.     }  
  48.   
  49.     public void setAddress(Address address) {  
  50.         this.address = address;  
  51.     }  
  52.   
  53.     @Override  
  54.     public String toString() {  
  55.         return "Person [name=" + name + ", age=" + age + ", male=" + male  
  56.                 + ", address=" + address + "]";  
  57.     }  
  58.   
  59. }  

首先使用方法一解析代码如下:
[java]  view plain  copy
  1. JSONObject jsonObject = new JSONObject(json);  
  2. String name = jsonObject.getString("name");  
  3. int age = jsonObject.getInt("age");  
  4. boolean male = jsonObject.getBoolean("male");  
  5. JSONObject addressJSON = jsonObject.getJSONObject("address");  
  6. String street = addressJSON.getString("street");  
  7. String city = addressJSON.getString("city");  
  8. String country = addressJSON.getString("country");  
  9. Address address = new Address(street, city, country);  
  10. Person person = new Person(name, age, male, address);  
  11. System.out.println(person);  
LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象.


2. 采用gson库解析JSON对象. 假设带解析的JSON数据是json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 首先需要到http://code.google.com/p/google-gson/下载jar包, 并将其添加到项目中. 具体的解析代码如下:

[java]  view plain  copy
  1. Gson gson = new Gson();  
  2. Person person = gson.fromJson(json, Person.class);  
  3. System.out.println(person);  
LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象, 是不是很简单?


3. 采用android内置的org.json包解析JSON数组. 假设待解析的JSON数据为json = "[{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}, {\"name\":\"min\", \"age\"=20, \"male\":false, \"address\":{\"street\":\"heiShiJiao\", \"city\":\"daLian\", \"country\":\"china\"}}]", 解析代码如下:

[java]  view plain  copy
  1. List<Person> persons = new ArrayList<Person>();  
  2. JSONArray jsonArray = new JSONArray(json);  
  3. for(int i = 0; i < jsonArray.length(); i++) {  
  4.     JSONObject jsonObject = jsonArray.getJSONObject(i);  
  5.     String name = jsonObject.getString("name");  
  6.     int age = jsonObject.getInt("age");  
  7.     boolean male = jsonObject.getBoolean("male");  
  8.     JSONObject addressJSON = jsonObject.getJSONObject("address");  
  9.     String street = addressJSON.getString("street");  
  10.     String city = addressJSON.getString("city");  
  11.     String country = addressJSON.getString("country");  
  12.     Address address = new Address(street, city, country);  
  13.     Person person = new Person(name, age, male, address);  
  14.     persons.add(person);  
  15. }  
  16. System.out.println(persons);  
LogCat的输出为[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 说明已经正确解析了JSON数组.

4. 采用gson库解析JSON数组. 待解析的JSON数据同上, 具体代码为:
[java]  view plain  copy
  1. Gson gson = new Gson();  
  2. Type listType = new TypeToken<List<Person>>(){}.getType();  
  3. List<Person> persons = gson.fromJson(json, listType);  
LogCat的输出为[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 说明已经正确解析了JSON数组.
new TypeToken<List<Person>>(){}.getType(); 这句代码表示创建一个 TypeToken的匿名子类对象, 并调用对象的getType()方法.

org.json包和gson库还有很多其他有用的API, 需要的时候可查看文档. 比如有的时候需要通过java对象或java集合和数组生成json数据上传给服务器, 当然你可以自我构造json字符串, 但会很麻烦. 这个时候就可以使用其中的有关API, 方便的完成这项工作.



测试用例:

[java]  view plain  copy
  1. package text.com;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.lang.reflect.Type;  
  8. import java.util.List;  
  9.   
  10. import text.com.bean.Address;  
  11. import text.com.bean.Person;  
  12.   
  13. import com.google.gson.Gson;  
  14. import com.google.gson.reflect.TypeToken;  
  15.   
  16. public class JsonTest {  
  17.     String jsonString = "";  
  18.   
  19.     public static void main(String[] args) {  
  20.         // Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",  
  21.         // "30号"));  
  22.         // Person p2 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",  
  23.         // "30号"));  
  24.         // Person p3 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",  
  25.         // "30号"));  
  26.         // List<Person> list = new ArrayList<Person>();  
  27.         // list.add(p1);  
  28.         // list.add(p2);  
  29.         // list.add(p3);  
  30.         // Gson gson = new Gson();  
  31.         // Type typeOfT = new TypeToken<List<Person>>(){}.getType();  
  32.         // String json = gson.toJson(list, typeOfT);  
  33.         // System.out.println("json:"+json);  
  34.   
  35.         // String str = readTxtFile("D:\\cjjworkspace\\Test\\json.txt");  
  36.         // System.out.println("文件内容:" + str);  
  37.          Gson gson = new Gson();  
  38.         // Type typeOfT = new TypeToken<List<Person>>(){}.getType();  
  39.         // List<Person> personList = gson.fromJson(str, typeOfT);  
  40.   
  41.         Person p1 = new Person("zhangsan"12truenew Address("北京""海淀区""30号"));  
  42.         Type typeOfT = new TypeToken<Person>(){}.getType();  
  43.         String str = gson.toJson(p1, typeOfT);  
  44.         System.out.println(str);  
  45.     }  
  46.   
  47.     public static String readTxtFile(String filePath) {  
  48.         String encoding = "utf-8";  
  49.         StringBuilder sb = new StringBuilder();  
  50.         try {  
  51.             File file = new File(filePath);  
  52.             if (file.isFile() && file.exists()) { // 判断文件是否存在  
  53.                 InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式  
  54.                 BufferedReader bufferedReader = new BufferedReader(read);  
  55.                 String str = "";  
  56.                 while ((str = bufferedReader.readLine()) != null) {  
  57.                     sb.append(str);  
  58.                 }  
  59.                 read.close();  
  60.                 return sb.toString();  
  61.             } else {  
  62.                 System.out.println("找不到指定的文件");  
  63.                 return null;  
  64.             }  
  65.         } catch (Exception e) {  
  66.             System.out.println("读取文件内容出错");  
  67.             e.printStackTrace();  
  68.         }  
  69.         return sb.toString();  
  70.     }  
  71. }  



附带:gson-2.2.4.jar

           gson-2.2.4-javadoc.jar

           gson-2.2.4-sources.jar




0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值