开发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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Address {
     private String street;
     private String city;
     private String country;
     public Address() {
         super ();
     }
     public Address(String street, String city, String country) {
         super ();
         this .street = street;
         this .city = city;
         this .country = country;
     }
     public String getStreet() {
         return street;
     }
     public void setStreet(String street) {
         this .street = street;
     }
     public String getCity() {
         return city;
     }
     public void setCity(String city) {
         this .city = city;
     }
     public String getCountry() {
         return country;
     }
     public void setCountry(String country) {
         this .country = country;
     }
     @Override
     public String toString() {
         return "Address [street=" + street + ", city=" + city + ", country="
                 + country + "]" ;
     }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class Person {
     private String name;
     private int age;
     private boolean male;
     private Address address;
     public Person() {
         super ();
     }
     public Person(String name, int age, boolean male, Address address) {
         super ();
         this .name = name;
         this .age = age;
         this .male = male;
         this .address = address;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this .name = name;
     }
     public int getAge() {
         return age;
     }
     public void setAge(int age) {
         this .age = age;
     }
     public boolean isMale() {
         return male;
     }
     public void setMale(boolean male) {
         this .male = male;
     }
     public Address getAddress() {
         return address;
     }
     public void setAddress(Address address) {
         this .address = address;
     }
     @Override
     public String toString() {
         return "Person [name=" + name + ", age=" + age + ", male=" + male
                 + ", address=" + address + "]" ;
     }
}

下面是具体的解析代码:

1
2
3
4
5
6
7
8
9
10
11
JSONObject jsonObject = new JSONObject(json);
String name = jsonObject.getString( "name" );
int age = jsonObject.getInt( "age" );
boolean male = jsonObject.getBoolean( "male" );
JSONObject addressJSON = jsonObject.getJSONObject( "address" );
String street = addressJSON.getString( "street" );
String city = addressJSON.getString( "city" );
String country = addressJSON.getString( "country" );
Address address = new Address(street, city, country);
Person person = new Person(name, age, male, address);
System.out.println(person);



LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象.

扫描二维码关注公众号,回复: 4300904 查看本文章


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包, 并将其添加到项目中. 具体的解析代码如下:

1
2
3
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
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\"}}]", 解析代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
List<Person> persons = new ArrayList<Person>();
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
     JSONObject jsonObject = jsonArray.getJSONObject(i);
     String name = jsonObject.getString( "name" );
     int age = jsonObject.getInt( "age" );
     boolean male = jsonObject.getBoolean( "male" );
     JSONObject addressJSON = jsonObject.getJSONObject( "address" );
     String street = addressJSON.getString( "street" );
     String city = addressJSON.getString( "city" );
     String country = addressJSON.getString( "country" );
     Address address = new Address(street, city, country);
     Person person = new Person(name, age, male, address);
     persons.add(person);
}
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数据同上, 具体代码为:

1
2
3
Gson gson = new Gson();
Type listType = new TypeToken<List<Person>>(){}.getType();
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数组.

猜你喜欢

转载自blog.csdn.net/zhang1314wen2008/article/details/12856985
今日推荐