转载:http://www.cnblogs.com/xiaoluo501395377/p/3446605.html
一、JSON
json(Javascript Object Notation)是一种轻量级的数据交换格式,客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。
json一共有两种数据结构,
- 一种是以 (key/value)对形式存在的无序的jsonObject对象。一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。例如:
key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型:
- 另一种数据格式就是有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
二、解析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对象在转换成我们的数据格式(称之为反序列化)。
JSON解析举例
①简单的javabean的序列化和反序列化
public class JsonTools
{
/**
* <span style="background-color: rgb(255, 255, 153);">得到一个json类型的字符串对象</span>
* @param key
* @param value
* @return
*/
public static String getJsonString(String key, Object value)
{
JSONObject jsonObject = new JSONObject();
//put和element都是往JSONObject对象中放入 key/value 对
// jsonObject.put(key, value);
jsonObject.element(key, value);
return jsonObject.toString();
}
/**
* <span style="background-color: rgb(255, 255, 153);">得到一个json对象</span>
* @param key
* @param value
* @return
*/
public static JSONObject getJsonObject(String key, Object value)
{
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
return jsonObject;
}
}
例如对实体类Person的JSON解析
public class Person
{
private int id;
private String name;
private String address;
public Person()
{
}
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;
}
public Person(int id, String name, String address)
{
super();
this.id = id;
this.name = name;
this.address = address;
}
@Override
public String toString()
{
return "Person [id=" + id + ", name=" + name + ", address=" + address
+ "]";
}
}
可以直接通过 JSONObject jsonObject = new JSONObject(); 这个方法就可以得到一个json对象,然后通过element()或者是put()方法来给json对象添加key/value对。
Person person = new Person(1, "xiaoluo", "广州");
// 将Person对象转换成一个json类型的字符串对象
String personString =<span style="background-color: rgb(255, 255, 153);"> JsonTools.getJsonString("person", person);</span>
System.out.println(personString.toString());
再来看看如何将json对象转换成我们的bean对象
JSONObject jsonObject = JsonTools.getJsonObject("person", person);//将person对象转换成json对象 JSONObject personObject = jsonObject.getJSONObject("person");//通过key值获得json对象 Person person2 = (Person) JSONObject.toBean(personObject, Person.class);//通过JSONObject的toBean方法可以将json对象转换成一个javabean System.out.println(person2);
②转换List<Person>类型的对象
@Test
public void testPersonsJson()
{
List<Person> persons = new ArrayList<Person>();
Person person = new Person(1, "xiaoluo", "广州");
Person person2 = new Person(2, "android", "上海");
persons.add(person);
persons.add(person2);
String personsString = JsonTools.getJsonString("persons", persons);
System.out.println(personsString);
JSONObject jsonObject = JsonTools.getJsonObject("persons", persons);
// List<Person>相当于一个JSONArray对象
JSONArray personsArray = (JSONArray)jsonObject.getJSONArray("persons");
List<Person> persons2 = (List<Person>) personsArray.toCollection(personsArray, Person.class);
System.out.println(persons2);
}
③List<Map<String, String>>类型的json对象转换
@Test
public void testMapJson()
{
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put("id", "001");
map1.put("name", "xiaoluo");
map1.put("age", "20");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("id", "002");
map2.put("name", "android");
map2.put("age", "33");
list.add(map1);
list.add(map2);
String listString = JsonTools.getJsonString("list", list);
System.out.println(listString);
JSONObject jsonObject = JsonTools.getJsonObject("list", list);
JSONArray listArray = jsonObject.getJSONArray("list");
List<Map<String, String>> list2 = (List<Map<String, String>>) listArray.toCollection(listArray, Map.class);
System.out.println(list2);
}
二、gson( http://code.google.com/p/google-gson/)
下面我们来看看Google提供的gson这个json解析库,同样我们需要去下载gson这个jar包,导入到我们的项目中
使用gson,我们可以非常轻松的实现数据对象和json对象的相互转化,
其中我们最常用的就是两个方法:
- 一个是fromJSON(),将json对象转换成我们需要的数据对象,
- 一个是toJSON(),这个就是将我们的数据对象转换成json对象。
下面我们也通过一个综合的例子来看看gson的使用方法:
public class JsonService
{
public Person getPerson()
{
Person person = new Person(1, "xiaoluo", "广州");
return person;
}
public List<Person> getPersons()
{
List<Person> persons = new ArrayList<Person>();
Person person = new Person(1, "xiaoluo", "广州");
Person person2 = new Person(2, "android", "上海");
persons.add(person);
persons.add(person2);
return persons;
}
public List<String> getString()
{
List<String> list = new ArrayList<String>();
list.add("广州");
list.add("上海");
list.add("北京");
return list;
}
public List<Map<String, String>> getMapList()
{
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put("id", "001");
map1.put("name", "xiaoluo");
map1.put("age", "20");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("id", "002");
map2.put("name", "android");
map2.put("age", "33");
list.add(map1);
list.add(map2);
return list;
}
}
public static void main(String[] args)
{
Gson gson = new Gson();
JsonService jsonService = new JsonService();
Person person = jsonService.getPerson();
System.out.println("person: " + gson.toJson(person));
// 对于Object类型,使用 fromJson(String, Class)方法来将Json对象转换成Java对象
Person person2 = gson.fromJson(gson.toJson(person), Person.class);
System.out.println(person2);
System.out.println("------------------------------------------------");
List<Person> persons = jsonService.getPersons();
System.out.println("persons: " + gson.toJson(persons));
/*
* 对于泛型对象,使用fromJson(String, Type)方法来将Json对象转换成对应的泛型对象
* new TypeToken<>(){}.getType()方法
*/
List<Person> persons2 = gson.fromJson(gson.toJson(persons), new TypeToken<List<Person>>(){}.getType());
System.out.println(persons2);
System.out.println("------------------------------------------------");
List<String> list = jsonService.getString();
System.out.println("String---->" + gson.toJson(list));
List<String> list2 = gson.fromJson(gson.toJson(list), new TypeToken<List<String>>(){}.getType());
System.out.println("list2---->" + list2);
System.out.println("------------------------------------------------");
List<Map<String, String>> listMap = jsonService.getMapList();
System.out.println("Map---->" + gson.toJson(listMap));
List<Map<String, String>> listMap2 = gson.fromJson(gson.toJson(listMap), new TypeToken<List<Map<String, String>>>(){}.getType());
System.out.println("listMap2---->" + listMap2);
System.out.println("------------------------------------------------");
}