转载请出自出处: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] ]]
四、带泛型的list集合处理
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]
相关推荐
4. **复杂类型的处理**:Gson能够处理各种复杂的Java类型,如集合、数组、枚举等。例如,解析一个包含多个`Person`对象的JSON数组: ```java Type listType = new TypeToken<List<Person>>(){}.getType(); List...
6. **日期和时间处理**:Gson内置了对日期和时间的处理,可以方便地将日期对象转换为不同的格式。 7. **延迟解析**:通过`JsonParser`类,Gson允许逐步解析大型JSON文档,只加载当前需要的部分,以节省资源。 8. *...
`gson-2.3.jar`是Gson库的一个版本,发布于2014年,是许多Java项目中广泛使用的JSON处理工具。 在`gson-2.3.jar`中,包含了Gson库的主要功能和API,如`GsonBuilder`用于构建自定义的Gson实例,`JsonParser`用于解析...
尽管较新的版本可能包含更多功能和优化,但对于那些对稳定性和兼容性有较高要求的项目,2.2.4仍然是一个可靠的选择。 使用Gson库,开发人员可以轻松地在Java应用和JSON数据之间构建桥梁,简化数据操作,提高代码的...
不过,Gson在处理集合时有一些限制,这些限制包括对于某些特定类型的集合处理上可能需要额外的配置。 9. 泛型类型序列化和反序列化 Gson能够处理泛型类型,但是需要注意的是泛型信息在运行时会被擦除,因此需要...
6. **日期和时间的处理**: Gson默认对日期的处理可能不满足所有场景,因此可以使用`JsonSerializer`和`JsonDeserializer`接口自定义日期格式。 7. **流式API(JsonWriter和JsonReader)**: 对于大量或复杂的JSON...
Gson 2.2.4版本还包含了对JSON解析错误的处理机制,如使用`JsonParser`类可以逐个解析JSON元素,如果在解析过程中遇到问题,它会抛出异常,帮助开发者定位问题。 除此之外,这个版本可能已经修复了之前版本中的一些...
JAR(Java Archive)是Java平台下的一个可执行文件格式,用于集合多个类文件和相关的元数据到一个文件中,便于分发和运行。在提供的压缩包中,有两个JAR文件——`gson-2.8.0.jar`和`gson-2.8.6.jar`,它们分别对应...
在实际使用中,如果你的项目依赖于旧的Gson特性并且对兼容性有较高要求,可以选择使用gson-1.4.jar。但是,如果需要最新的功能和更好的性能,或者你的项目使用了Java 8或更高版本的特性,那么gson-2.8.0.jar将是更...
在本教程中,我们将深入探讨一系列关键的编程和数据分析技术,包括Gson、HttpClient、Java 9、Python数据结构、SciPy以及Thymeleaf。这些技术在现代软件开发和数据分析领域都扮演着重要的角色。 首先,让我们从Gson...
- 错误处理:在1.7.1版本中,Gson对错误处理进行了优化,提高了容错能力,减少了因JSON数据异常导致的程序崩溃。 - 性能提升:针对序列化和反序列化的速度进行了优化,提高了处理大量数据时的效率。 - 兼容性增强...
4. 支持复杂数据结构:Gson可以处理各种复杂的Java数据结构,包括数组、集合、Map以及嵌套的对象。 5. 性能优秀:Gson在处理大量数据时表现出良好的性能,对于大型项目来说是一个可靠的解决方案。 6. 错误处理:...
总之,Gson是一个强大的工具,能够方便地处理JSON数据,无论是在Android应用、服务器端应用还是其他Java项目中,都是处理JSON的首选库之一。通过这个包含多个版本的jar包,开发者可以根据项目的具体需求来选择最合适...
对于数组或集合类型,Gson同样能处理。如果你有一个`User`对象的列表: ```java List<User> userList = new ArrayList(); // 添加用户到list... ``` 你可以这样转换整个列表: ```java String jsonList = gson.to...
4. **任意复杂度的支持**:Gson 能够处理任意复杂的 Java 对象结构,包括嵌套对象、集合类型等。 #### 三、性能与可扩展性 Gson 在设计上考虑到了性能和可扩展性的平衡。其内部实现了高效的 JSON 处理算法,使得...
在给定的文件中,有两个版本的Gson jar包:gson-2.2.1.jar和gson-2.6.2.jar,后者是较新的版本,可能包含更多改进和修复。 **Fastjson** 是阿里巴巴开发的一个高性能的JSON库,它同样提供了Java对象与JSON数据之间...
在Java开发中,处理JSON数据是一项常见的任务,Google推出的Gson库为我们提供了高效且便捷的解决方案。Gson库能够将Java对象转换成JSON字符串,同时也能将JSON文本解析成对应的Java对象,使得JSON数据的处理变得简单...
**Gson库详解** 在Java开发中,数据交换与存储经常需要用到JSON...总的来说,Gson-2.7.jar作为Gson库的一个版本,提供了一套强大且易用的JSON处理方案,广泛应用于Java开发中,极大地简化了JSON数据的处理工作。
Gson不仅可以处理简单的Java对象,还可以处理复杂的类型,如集合、数组和嵌套的对象。例如,如果有包含多个`Person`的列表: ```java List<Person> peopleList = Arrays.asList( new Person("王五", 40), new ...
Java操作JSON的类库Google-Gson是开发人员在处理JSON数据时的一个强大工具。它以其稳定性和易用性而闻名,被广泛应用于各种Java项目中。Google-Gson库允许我们将Java对象转换为JSON字符串,反之亦然,极大地简化了...