转载请出自出处:http://eksliang.iteye.com/blog/2175532
一、概述
Map保存的是键值对的形式,Json的格式也是键值对的,所以正常情况下,map跟json之间的转换应当是理所当然的事情。
二、Map参考实例
package com.ickes.json; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.ickes.json.daomain.User; /** * Gson对Map的处理 * @author Ickes * */ public class MapTest { public static void main(String[] args) { /** * 普通map处理 */ Map<String,String> map = new HashMap<String,String>(); map.put("name","ickes"); map.put("pwd", "123"); Gson gson = new GsonBuilder() .enableComplexMapKeySerialization() .setPrettyPrinting() .setDateFormat("yyyy-MM-dd HH:mm:ss") .create(); //map的序列化 String json=gson.toJson(map); System.out.println("map的序列化:\n"+json); //map的反序列化 Type typeMap = new TypeToken<Map<String,String>>(){}.getType(); map = gson.fromJson(json,typeMap); System.out.println("map的反序列化:"); for (Map.Entry<String,String> entry: map.entrySet()) { System.out.println(entry.getKey()+"-"+entry.getValue()); } /** * /map对象测试 */ Map<String,User> mapUser = new HashMap<String,User>(); User user1 = new User("A001", "xl","xl_123",24,12000F,new Date()); User user2 = new User("A002", "x2","xl_223",24,13000F,new Date()); mapUser.put("user1",user1); mapUser.put("user2",user2); json = gson.toJson(mapUser); System.out.println("Map对象的序列化:\n"+json); //map对象的反序列化 Type typeUser = new TypeToken<Map<String,User>>(){}.getType(); mapUser = gson.fromJson(json, typeUser); System.out.println("map对象的反序列化:"); for (Map.Entry<String,User> entry: mapUser.entrySet()) { System.out.println(entry.getKey()+"-"+entry.getValue()); } /** * 整合测试 */ Map<String,List<User>> mapList = new HashMap<String,List<User>>(); List<User> users = new ArrayList<User>(); users.add(user1); users.add(user2); mapList.put("mapList",users); //序列化 json = gson.toJson(mapList); System.out.println("mapList的序列化:\n"+json); //反序列化 Type typeMapList = new TypeToken<Map<String,List<User>>>(){}.getType(); mapList = gson.fromJson(json, typeMapList); System.out.println("mapList对象的反序列化:"); for (Map.Entry<String,List<User>> entry: mapList.entrySet()) { System.out.println(entry.getKey()+"-"+entry.getValue()); } } }
返回结果:
map的序列化:
{
"pwd": "123",
"name": "ickes"
}
map的反序列化:
pwd-123
name-ickes
Map对象的序列化:
{
"user2": {
"id": "A002",
"userName": "x2",
"userPwd": "xl_223",
"age": 24,
"price": 13000.0,
"birthday": "2015-01-13 16:06:48"
},
"user1": {
"id": "A001",
"userName": "xl",
"userPwd": "xl_123",
"age": 24,
"price": 12000.0,
"birthday": "2015-01-13 16:06:48"
}
}
map对象的反序列化:
user2-User [id=A002, userName=x2, userPwd=xl_223, age=24, price=13000.0, birthday=Tue Jan 13 16:06:48 CST 2015]
user1-User [id=A001, userName=xl, userPwd=xl_123, age=24, price=12000.0, birthday=Tue Jan 13 16:06:48 CST 2015]
mapList的序列化:
{
"mapList": [
{
"id": "A001",
"userName": "xl",
"userPwd": "xl_123",
"age": 24,
"price": 12000.0,
"birthday": "2015-01-13 16:06:48"
},
{
"id": "A002",
"userName": "x2",
"userPwd": "xl_223",
"age": 24,
"price": 13000.0,
"birthday": "2015-01-13 16:06:48"
}
]
}
mapList对象的反序列化:
mapList-[User [id=A001, userName=xl, userPwd=xl_123, age=24, price=12000.0, birthday=Tue Jan 13 16:06:48 CST 2015], User [id=A002, userName=x2, userPwd=xl_223, age=24, price=13000.0, birthday=Tue Jan 13 16:06:48 CST 2015]]
温馨提示:Gson在序列化Map时,默认情况下,是调用Key的toString方法得到它的JSON字符串的Key,对于简单类型和字符串类型,这没有问题,但是对于复杂数据对象,如果对象没有覆写toString方法,那么默认的toString方法将得到这个对象的Hash地址,通过调用GsonBuilder的enableComplexMapKeySerialization()来启用对Map键(key)的序列化.
三、一对多参考实例
下面实例提供了User(员工)对Dept(部门)一对多的映射关系
User实体类:
package com.ickes.json.daomain; import java.util.Date; /** * @author Ickes */ public class User { private String userName; private String userPwd; private Integer age; private Date birthday; public User(String userName, String userPwd, Integer age, Date birthday) { super(); this.userName = userName; this.userPwd = userPwd; this.age = age; this.birthday = birthday; } get()和set()方法省略.....! @Override public String toString() { return "User [userName=" + userName + ", userPwd=" + userPwd + ", age=" + age + ", birthday=" + birthday + "]"; } }
Dept实体类:
package com.ickes.json.daomain; import java.util.List; public class Dept { private String id; private String deptName; private List<User> users; public Dept(String id, String deptName) { super(); this.id = id; this.deptName = deptName; } get()和set()方法省略......! @Override public String toString() { return "Dept [id=" + id + ", deptName=" + deptName + ", users=" + users + "]"; } }
测试实体类:
package com.ickes.json.daomain; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.google.gson.Gson; import com.google.gson.GsonBuilder; /** * Gson处理这种一对多的序列化 * @author Ickes * */ public class DeptTest { public static void main(String[] args) { User user1 = new User("xl","xl_223",12100,new Date()); User user2 = new User("x2","xl_323",12300,new Date()); User user3 = new User("x3","xl_423",12300,new Date()); Dept dept = new Dept("D001","技术预研部"); List<User> users = new ArrayList<User>(); users.add(user1); users.add(user2); users.add(user3); dept.setUsers(users); Gson gson = new GsonBuilder() .setPrettyPrinting() .setDateFormat("yyyy-MM-dd HH:mm:ss") .create(); String json=gson.toJson(dept); System.out.println("一对多的序列化:\n"+json); dept = gson.fromJson(json,Dept.class); System.out.println("一对多的反序列化:\n"+dept); } }
返回结果如下:
一对多的序列化: { "id": "D001", "deptName": "技术预研部", "users": [ { "userName": "xl", "userPwd": "xl_223", "age": 12100, "birthday": "2015-01-13 18:57:23" }, { "userName": "x2", "userPwd": "xl_323", "age": 12300, "birthday": "2015-01-13 18:57:23" }, { "userName": "x3", "userPwd": "xl_423", "age": 12300, "birthday": "2015-01-13 18:57:23" } ] } 一对多的反序列化: Dept [id=D001, deptName=技术预研部, users=[User [userName=xl, userPwd=xl_223, age=12100, birthday=Tue Jan 13 18:57:23 CST 2015], User [userName=x2, userPwd=xl_323, age=12300, birthday=Tue Jan 13 18:57:23 CST 2015], User [userName=x3, userPwd=xl_423, age=12300, birthday=Tue Jan 13 18:57:23 CST 2015] ]]