一:什么是Json
json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。
json一共有两种数据结构,一种是以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
例如:{"name": "xiaoluo"}, 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型:
我们最常用的两个类就是 JSONObject和JSONArray这两个类,分别代表了json对象和json数组,这两个类都实现了 JSON 这个接口,下面我们通过几个小例子来看看如何将我们常见的几种数据格式转换成我们的json对象(我们一般称之为JSON数据的序列化)以及再将json对象在转换成我们的数据格式(称之为反序列化)。
二:解析json数据格式
json-lib
①简单的javabean的序列化和反序列化
创建一个实体
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
+ "]";
}
}
我们先定义一个JsonTools类,这个类有两个静态方法,我们可以通过这两个方法来得到一个JSON类型的字符串对象,以及一个JSON对象
public class JsonTools
{
/**
* 得到一个json类型的字符串对象
* @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();
}
/**
* 得到一个json对象
* @param key
* @param value
* @return
*/
public static JSONObject getJsonObject(String key, Object value)
{
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
return jsonObject;
}
}
们可以直接通过 JSONObject jsonObject = new JSONObject(); 这个方法就可以得到一个json对象,然后通过element()或者是put()方法来给我们的json对象添加key/value对。我们先来看看第一个例子,实现一个简单的Person对象和json对象的转换
Person person = new Person(1, "xiaoluo", "广州");
// 将Person对象转换成一个json类型的字符串对象
String personString = JsonTools.getJsonString("person", person);
System.out.println(personString.toString());
输出{"person":{"address":"广州","id":1,"name":"xiaoluo"}}
再来看看如何将json对象转换成我们的bean对象
// 通过JSONObject的toBean方法可以将json对象转换成一个javabean
JSONObject personObject = jsonObject.getJSONObject("person");
Person person2 = (Person) JSONObject.toBean(personObject, Person.class);
System.out.println(person2);
Person [id=1, name=xiaoluo, address=广州]
②转换List
@Test public void testPersonsJson()
{
List persons = new ArrayList();
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);
输出
{"persons":[{"address":"广州","id":1,"name":"xiaoluo"},{"address":"上海","id":2,"name":"android"}]}
JSONObject jsonObject = JsonTools.getJsonObject("persons", persons); // List相当于一个JSONArray对象
JSONArray personsArray = (JSONArray)jsonObject.getJSONArray("persons");
List persons2 = (List) personsArray.toCollection(personsArray, Person.class);
System.out.println(persons2);
}
输出
[Person [id=1, name=xiaoluo, address=广州], Person [id=2, name=android, address=上海]]
③List
@Test
public void testMapJson()
{
List
json
public class JsonService
{
public Person getPerson()
{
Person person = new Person(1, "xiaoluo", "广州");
return person;
}
public List getPersons()
{
List persons = new ArrayList();
Person person = new Person(1, "xiaoluo", "广州");
Person person2 = new Person(2, "android", "上海");
persons.add(person);
persons.add(person2);
return persons;
}
public List getString()
{
List list = new ArrayList();
list.add("广州");
list.add("上海");
list.add("北京");
return list;
}
public List> getMapList()
{
List> list = new ArrayList>();
Map map1 = new HashMap();
map1.put("id", "001");
map1.put("name", "xiaoluo");
map1.put("age", "20");
Map map2 = new HashMap();
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 persons = jsonService.getPersons();
System.out.println("persons: " + gson.toJson(persons));
/*
* 对于泛型对象,使用fromJson(String, Type)方法来将Json对象转换成对应的泛型对象
* new TypeToken<>(){}.getType()方法
*/
List persons2 = gson.fromJson(gson.toJson(persons), new TypeToken>(){}.getType());
System.out.println(persons2);
System.out.println("------------------------------------------------");
List list = jsonService.getString();
System.out.println("String---->" + gson.toJson(list));
List list2 = gson.fromJson(gson.toJson(list), new TypeToken>(){}.getType());
System.out.println("list2---->" + list2);
System.out.println("------------------------------------------------");
List> listMap = jsonService.getMapList();
System.out.println("Map---->" + gson.toJson(listMap));
List> listMap2 = gson.fromJson(gson.toJson(listMap), new TypeToken>>(){}.getType());
System.out.println("listMap2---->" + listMap2);
System.out.println("------------------------------------------------");
}
输出内容:
person: {"id":1,"name":"xiaoluo","address":"广州"}
Person [id=1, name=xiaoluo, address=广州]
------------------------------------------------
persons: [{"id":1,"name":"xiaoluo","address":"广州"},{"id":2,"name":"android","address":"上海"}]
[Person [id=1, name=xiaoluo, address=广州], Person [id=2, name=android, address=上海]]
------------------------------------------------
String---->["广州","上海","北京"]
list2---->[广州, 上海, 北京]
------------------------------------------------
Map---->[{"id":"001","age":"20","name":"xiaoluo"},{"id":"002","age":"33","name":"android"}]
listMap2---->[{id=001, age=20, name=xiaoluo}, {id=002, age=33, name=android}]
------------------------------------------------