zoukankan      html  css  js  c++  java
  • android笔记JSON数据解析

    什么是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代码 复制代码 收藏代码
    1. public class Address {   
    2.     private String street;   
    3.     private String city;   
    4.     private String country;   
    5.   
    6.     public Address() {   
    7.         super();   
    8.     }   
    9.   
    10.     public Address(String street, String city, String country) {   
    11.         super();   
    12.         this.street = street;   
    13.         this.city = city;   
    14.         this.country = country;   
    15.     }   
    16.   
    17.     public String getStreet() {   
    18.         return street;   
    19.     }   
    20.   
    21.     public void setStreet(String street) {   
    22.         this.street = street;   
    23.     }   
    24.   
    25.     public String getCity() {   
    26.         return city;   
    27.     }   
    28.   
    29.     public void setCity(String city) {   
    30.         this.city = city;   
    31.     }   
    32.   
    33.     public String getCountry() {   
    34.         return country;   
    35.     }   
    36.   
    37.     public void setCountry(String country) {   
    38.         this.country = country;   
    39.     }   
    40.   
    41.     @Override  
    42.     public String toString() {   
    43.         return "Address [street=" + street + ", city=" + city + ", country="  
    44.                 + country + "]";   
    45.     }   
    46.   
    47. }  
    Java代码 复制代码 收藏代码
    1. public class Person {   
    2.     private String name;   
    3.     private int age;   
    4.     private boolean male;   
    5.     private Address address;   
    6.   
    7.     public Person() {   
    8.         super();   
    9.     }   
    10.   
    11.     public Person(String name, int age, boolean male, Address address) {   
    12.         super();   
    13.         this.name = name;   
    14.         this.age = age;   
    15.         this.male = male;   
    16.         this.address = address;   
    17.     }   
    18.   
    19.     public String getName() {   
    20.         return name;   
    21.     }   
    22.   
    23.     public void setName(String name) {   
    24.         this.name = name;   
    25.     }   
    26.   
    27.     public int getAge() {   
    28.         return age;   
    29.     }   
    30.   
    31.     public void setAge(int age) {   
    32.         this.age = age;   
    33.     }   
    34.   
    35.     public boolean isMale() {   
    36.         return male;   
    37.     }   
    38.   
    39.     public void setMale(boolean male) {   
    40.         this.male = male;   
    41.     }   
    42.   
    43.     public Address getAddress() {   
    44.         return address;   
    45.     }   
    46.   
    47.     public void setAddress(Address address) {   
    48.         this.address = address;   
    49.     }   
    50.   
    51.     @Override  
    52.     public String toString() {   
    53.         return "Person [name=" + name + ", age=" + age + ", male=" + male   
    54.                 + ", address=" + address + "]";   
    55.     }   
    56.   
    57. }  

    下面是具体的解析代码:

    Java代码 复制代码 收藏代码
    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代码 复制代码 收藏代码
    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代码 复制代码 收藏代码
    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代码 复制代码 收藏代码
    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, 方便的完成这项工作.
  • 相关阅读:
    十四、内存泄露和强软弱虚引用
    十五、对象的内存布局
    Android Service全解(三)之 Foreground Service(转)
    android中不同activity的传参调用和返回
    Android Service全解(一)之 startService(转)
    Android Service全解(二)之 bindService(转)
    android单点、多点触控之MotionEvent
    关于创建进程函数CreateProcess()字符串参数的说明
    sql中连接两个不同的数据库(A在同一个服务器,B不在一个服务器)
    asp.net小数点四舍五入的方法
  • 原文地址:https://www.cnblogs.com/qingblog/p/2521494.html
Copyright © 2011-2022 走看看