json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。
一、JSON数据结构
json一共有两种数据结构。
1、JSON对象
它是一个无序的以 (key/value)对形式存在的集合,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。如:{
"name": "jackson",
"age":28
}
这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型:
2、JSON数组
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。如:
{
“students”:
[
{"name" : "jackson" , "age" : 28} ,
{"name" : "michael" , "age" : 30}
]
}
二、解析json数据格式
这里将使用两种json的解析库来对我们的json数据格式进行解析以及生成我们的json数据格式。
1.json-lib(http://json-lib.sourceforge.net/)
使用json-lib来进行解析,我们需要引入第三方的包,因为json-lib分为了两个版本,一个版本是针对于jdk1.3的,一个版本是针对于jdk1.5的,这里我们下载jdk1.5的这个json-lib包,其中还需要引入其他的几个jar包:
下载好这几个jar包后,加入到classpath中即可。我们来看看json-lib给我们提供的API。
我们最常用的两个类就是 JSONObject和JSONArray这两个类,分别代表了json对象和json数组,这两个类都实现了 JSON 这个接口,下面我们通过几个小例子来看看如何将我们常见的几种数据格式转换成我们的json对象(我们一般称之为JSON数据的序列化)以及再将json对象在转换成我们的数据格式(称之为反序列化)。
首先我们定义一个简单的javabean对象,然后将一个Person对象转换成json对象,然后再将这个json对象反序列化成我们的Person对象。
public class Person {
private int id;
private String name;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return"person [id="+id+", name="+name+", address="+address+"]";
}
public Person(int id, String name, String address) {
super();
this.id = id;
this.name = name;
this.address = address;
}
}
我们先定义一个JsonTools类,这个类有两个静态方法,我们可以通过这两个方法来得到一个JSON类型的字符串对象,以及一个JSON对象public class JsonTools {
public static String createJsonString(String key,Object value){
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
return jsonObject.toString();
}
}
我们可以直接通过 JSONObject jsonObject = new JSONObject(); 这个方法就可以得到一个json对象,然后通过element()或者是put()方法来给我们的json对象添加key/value对。
2.1、转换一个JSON对象
我们先来看看第一个例子,实现一个简单的Person对象和json对象的转换。
Person person = new Person(1001,"jack","beijing");
jsonStr = JsonTools.createJsonString("person",person);
System.out.println(jsonStr);
控制台的输出:
整个外面的大括号是一个json对象,里面有一对key/value,其中里面的{"address":"beijing","id":1001,"name":"jack"}就是我们转换成的json字符串对象。
2.1.1在Android客户端解析过程如下:
public static Person getPerson(String key,String jsonString) {
Person person = new Person();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONObject personObject = jsonObject.getJSONObject("person");//获得对象的实例
//读取对象里每个键的值
person.setId(personObject.getInt("id"));
person.setName(personObject.getString("name"));
person.setAddress(personObject.getString("address"));
} catch (JSONException e) {
e.printStackTrace();
}
return person;
}
测试调用程序如下:
String jsonStr = HttpUtils.getJsonContent("http://192.168.0.100:8080/jsonProject/servlet/JsonAction?flag=person");
Person person = JsonTools.getPerson("person", jsonStr);
Log.d("emp", person.toString());
2.2、转换多个对象(List<Person>类型的对象)
List<Person> list = new ArrayList<Person>();
Person person1 = new Person(1001,"jack","广东");
Person person2 = new Person(1002,"rose","广西");
Person person3 = new Person(1003,"James","福建");
list.add(person1);
list.add(person2);
list.add(person3);
jsonStr = JsonTools.createJsonString("persons",service.getPersonList());
System.out.println(jsonStr);
控制台的输出:{"persons":[{"address":"广东","id":1001,"name":"jack"},{"address":"广西","id":1002,"name":"rose"},{"address":"福建","id":1003,"name":"James"}]}
2.2.1在Android客户端解析过程如下:
public static List<Person> getPersons(String key,String jsonString){
List<Person> list = new ArrayList<Person>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);//获得对象数组
for(int i = 0;i<jsonArray.length();i++){
//遍历数组里的每个对象
JSONObject obj = jsonArray.getJSONObject(i);
Person person = new Person();
//读取对象里每个键的值
person.setId(obj.getInt("id"));
person.setName(obj.getString("name"));
person.setAddress(obj.getString("address"));
list.add(person);
}
} catch (Exception e) {
}
return list;
}
测试调用程序如下:String jsonStr = HttpUtils.getJsonContent("http://192.168.0.100:8080/jsonProject/servlet/JsonAction?flag=persons");
List<Person> persons = JsonTools.getPersons("persons", jsonStr);
Log.d("emp", persons.toString());
2.3、转换简单类型的数组
List<String> list = new ArrayList<String>();
list.add("广东");
list.add("广西");
list.add("福建");
jsonStr = JsonTools.createJsonString("liststring",list);
System.out.println(jsonStr);
控制台的输出:{"liststring":["广东","广西","福建"]}
2.3.1在Android客户端解析过程如下:
public static List<String> getListString(String key,String jsonString){
List<String> list = new ArrayList<String>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);//获得json数组
for(int i = 0;i<jsonArray.length();i++){
//遍历数组每个元素
String msg = jsonArray.getString(i);
list.add(msg);
}
} catch (Exception e) {
}
return list;
}
测试调用程序如下:String jsonStr = HttpUtils.getJsonContent("http://192.168.0.100:8080/jsonProject/servlet/JsonAction?flag=liststring");
List<String> list = JsonTools.getListString("liststring",jsonStr);
Log.d("emp", list.toString());
2.4、List<Map<String, Object>>类型的json对象转换
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Person person1 = new Person(1001,"jack","广东");
Person person2 = new Person(1002,"rose","广西");
Person person3 = new Person(1003,"James","福建");
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("id", 1001);
map1.put("name","jack");
map1.put("address","广东");
Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("id", 1002);
map2.put("name","rose");
map2.put("address","广西");
Map<String,Object> map3 = new HashMap<String,Object>();
map3.put("id", 1003);
map3.put("name","James");
map3.put("address","福建");
list.add(map1);
list.add(map2);
list.add(map3);
jsonStr = JsonTools.createJsonString("listmap",list);
System.out.println(jsonStr);
控制台的输出:{"listmap":[{"address":"广东","name":"jack","id":1001},{"address":"广西","name":"rose","id":1002},{"address":"福建","name":"James","id":1003}]}
2.4.1在Android客户端解析过程如下:
public static List<Map<String,Object>> listKeyMap(String key,String jsonString){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);//获得json数组
for(int i = 0;i<jsonArray.length();i++){
JSONObject obj = jsonArray.getJSONObject(i);//遍历数组每个对象
Map<String,Object> map = new HashMap<String, Object>();
Iterator<String> iterator = obj.keys();
//遍历对象里的每个键值对
while (iterator.hasNext()) {
String map_key = iterator.next();
Object map_value = obj.get(map_key);
if(map_value == null){
map_value = "";
}
map.put(map_key, map_value);
}
list.add(map);
}
} catch (Exception e) {
}
return list;
}
测试调用程序如下:String jsonStr = HttpUtils.getJsonContent("http://192.168.0.100:8080/jsonProject/servlet/JsonAction?flag=listmap");
List<Map<String,Object>> list1 = JsonTools.listKeyMap("listmap",jsonStr);
Log.d("emp", list1.toString());
2、gson(http://code.google.com/p/google-gson/)下面我们来看看Google提供的gson这个json解析库,同样我们需要去下载gson这个jar包,导入到我们的项目中使用gson,我们可以非常轻松的实现数据对象和json对象的相互转化,其中我们最常用的就是两个方法,一个是fromJSON(),将json对象转换成我们需要的数据对象,另一个是toJSON(),这个就是将我们的数据对象转换成json对象。下面我们也通过一个综合的例子来看看gson的使用方法。
数据转为json字符串:
public static String createJsonString(Object value){
Gson gson = new Gson();
return gson.toJson(value);
}
json字符串转为数据:2.1、使用泛型获取一个对象
public static <T> T getPerson(String jsonStr,Class<T> cls){
T t = null;
try {
Gson gson = new Gson();
t = gson.fromJson(jsonStr, cls);
} catch (Exception e) {
}
return t;
}
2.2、获得多个对象(List<Person>类型的对象)
public static <T>List<T> getPersons(String jsonStr,Class<T> cls){
List<T> list = new ArrayList<T>();
try {
Gson gson = new Gson();
list = gson.fromJson(jsonStr, new TypeToken<List<T>>(){}.getType());
} catch (Exception e) {
// TODO: handle exception
}
return list;
}
2.3、List<Map<String,
Object>>类型的json对象转换 public static List<Map<String,Object>> listKeyMaps(String jsonStr){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
try {
Gson gson = new Gson();
list = gson.fromJson(jsonStr, new TypeToken<List<Map<String,Object>>>(){}.getType());
} catch (Exception e) {
// TODO: handle exception
}
return list;
}