[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
什么是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:
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 + "]";
}
}
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 + "]";
}
}
下面是具体的解析代码:
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对象.
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包, 并将其添加到项目中. 具体的解析代码如下:
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\"}}]", 解析代码如下:
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数据同上, 具体代码为:
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数组.
new TypeToken<List<Person>>(){}.getType(); 这句代码表示创建一个TypeToken的匿名子类对象, 并调用对象的getType()方法.
org.json包和gson库还有很多其他有用的API, 需要的时候可查看文档. 比如有的时候需要通过java对象或java集合和数组生成json数据上传给服务器, 当然你可以自我构造json字符串, 但会很麻烦. 这个时候就可以使用其中的有关API, 方便的完成这项工作.
分享到:
相关推荐
这篇“Android学习笔记--Gson笔记”将深入探讨如何利用Gson来处理JSON数据,提升Android应用的数据解析效率。 一、Gson简介 Gson库能够将Java对象转换成对应的JSON字符串,反之亦然,这使得在Android应用中存储、...
本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析。 1.JSON数据结构 在JSON中有两种数据结构:对象和数组。 1.1对象 在JSON中,一个对象以“{”...
- **JSON解析**:解析服务器返回的JSON格式数据。 - **Web服务**:实现与服务器的交互功能。 #### 四、高级开发技巧 ##### 4.1 多线程与异步处理 - **Handler和Looper**:处理消息队列。 - **AsyncTask**:简化...
### Day06: 网络通信与JSON解析 安卓应用往往需要与服务器进行数据交换。第六天,我们学习了使用HttpURLConnection、OkHttp和Retrofit等库进行网络请求,同时讲解了如何解析JSON数据,包括使用Gson和Jackson库将...
服务器端采用Struts2编码,Android客户端采用Json解析它的数据 服务器端程序为ServerProject(用MyEclipse建立此项目),Android客户端程序代码为:AndroidHttpJSONActivity 注意Android客户端代码中,有一个ip地址,...
10. **第三方库集成**:Android开发中,经常会使用到第三方库,如Retrofit进行网络请求,Gson进行JSON解析,ButterKnife进行视图注入等。课程会介绍这些库的使用方法和优势。 11. **性能优化**:最后,课程可能会...
本文将深入探讨如何在Android中使用Gson库解析JSON数据。 首先,理解JSON的基本结构至关重要。JSON对象以大括号`{}`表示,内部包含键值对,键必须是字符串,值可以是字符串、数字、布尔值、null、另一个JSON对象或...
进入十一章,可能会介绍到网络编程,如HTTP请求、JSON解析和异步任务(AsyncTask)。这部分内容教你如何使用HttpURLConnection或者第三方库如OkHttp来发送网络请求,获取并解析JSON数据。同时,Android的异步机制...
网络编程是现代应用不可或缺的一部分,笔记中详细讲述了如何使用HttpURLConnection、OkHttp和Retrofit等库进行网络请求,以及如何处理JSON数据,解析XML。 Android的通知系统也得到了详尽的解释,包括如何创建通知...
如果涉及到JSON解析,可能使用了Gson或Jackson库。 4. **多线程与异步处理**:介绍了Android的AsyncTask、IntentService和Thread池,以及使用Handler和Runnable进行UI线程与后台线程间的通信。 5. **生命周期管理*...
笔记可能涵盖HTTP请求库如OkHttp的使用,JSON解析库如Gson或Jackson的应用,以及如何处理异步任务和线程管理,比如使用AsyncTask或Retrofit。 此外,权限管理在Android系统中至关重要,尤其是从Android 6.0(API...
5. **网络通信**:Android应用常常需要与服务器交互,因此需要掌握HTTP/HTTPS请求,JSON解析,以及使用Retrofit、Volley等网络库。 6. **多线程**:Android主线程不能执行耗时操作,所以需要使用AsyncTask、...
《深入解析Android饭否客户端源码》 饭否客户端源码是Android开发中一个重要的学习资源,它为我们提供了深入了解Android应用程序设计与实现的窗口。在这个源码中,我们可以看到一个完整的社交应用是如何从无到有,...
《深入解析小米便签源码:Android开发的实践与学习》 小米便签作为一款深受用户喜爱的手机应用,其背后的源码对于Android开发者来说,无疑是宝贵的参考资料和学习素材。通过对小米便签源码的分析,我们可以深入了解...
7. **JSON解析**:在网络通信中,数据通常以JSON格式传输。Android内置了`Gson`或`org.json`库来解析和构建JSON对象。 8. **生命周期管理**:Android Activity有特定的生命周期,开发者必须理解并适当地处理各个...
掌握异步请求、JSON解析和网络权限管理是进行网络通信的基础。 9. **Service与BroadcastReceiver**:Service是后台运行的组件,BroadcastReceiver则可以监听系统或自定义广播事件。理解如何创建和使用这两者,能...
6. **网络编程**:HTTP请求与响应,使用HttpURLConnection或OkHttp进行网络请求,理解JSON格式的数据解析,以及使用Retrofit和Volley等网络库进行更高效的数据交互。 7. **多线程**:理解Android主线程(UI线程)与...
Android应用经常需要与服务器进行数据交换,这涉及HTTP请求、JSON解析等。笔记会介绍如何使用HttpURLConnection或OkHttp进行网络请求,以及如何处理异步任务,避免ANR(Application Not Responding)错误。 九、...
Android应用可能需要访问网络获取数据,涉及HTTP/HTTPS请求、JSON解析、WebSocket等技术。 十一、数据库SQLite SQLite是Android内置的轻量级数据库,用于存储应用数据。 十二、多媒体处理 Android支持处理图片、...