ITprivate 2015-01-14
Map保存的是键值对的形式,Json的格式也是键值对的,所以正常情况下,map跟json之间的转换应当是理所当然的事情。
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] ]]
public static void main(String[] args) { Gson gson = new Gson(); String json="[{'last':'xiao','next':'ming'},{'last':'xiao','next':'liang'}]"; List<Dept> list= null; list = gson.fromJson(json,new TypeToken<List<Dept>>(){}.getType()); for (Dept dept : list) { System.out.println(dept); } }
返回结果如下:
Dept [last=xiao, next=ming] Dept [last=xiao, next=liang]
.create();String param = "xxxxxxx";Map<String, Map<String, List<MpAppInfo>>> inParams = gson.fromJso