Java中让fastJson识别Colloction和Map中的泛型类
由于fastJson的高效性,最近采用fastJson来做序列化并存储数据,但出现了一个麻烦的问题,如果将Map<K,V>这样的类型序列化,反序列化就会不尽人意,有以下尝试:
- 使用JSON.parseObject(json):得到的结果是无类型Map,其value为JSONObject。
- 使用JSON.parseObject(json, Map.class):结果同上。
虽然说使用JSONObject.toJavaObject(V.class)也能够完成所求,但是这样的方法还是略麻烦,而且如果对key也要利用,那就要对key和value都来一下。在查阅资料后终于找到了正确的方案:TypeReference类。
简单介绍下,TypeReference类是Java给出的用于明确指定反序列化类型的类,其<>中放入一个复合类型,其参数为复合类型的Class对象,使用示例(我对该方法针对Map做的一个封装)如下:
public static <K, V> Map<K, V> json2Map(String path, Class<K> k, Class<V> v) throws Exception {
return JSON.parseObject(path, new TypeReference<Map<K, V>>(k, v) {
});
}
测试如下:
public class TypeReferenceTest {
public static <K, V> Map<K, V> json2Map(String path, Class<K> k, Class<V> v) throws Exception {
return JSON.parseObject(path, new TypeReference<Map<K, V>>(k, v) {
});
}
public static class Person {
private String name;
private String age;
public Person(String name, String age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("My name is " + name + " and I am " + age + ".");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
public static void main(String[] args) throws Exception {
Map input = new HashMap();
input.put(0L, new Person("Cielo", "3"));
input.put(1L, new Person("Vicky", "1"));
String str = JSON.toJSONString(input);
Map<Long, Person> map = json2Map(str, Long.class, Person.class);
map.forEach((key, value) -> {
System.out.println(key);
value.introduce();
});
}
}
测试结果如下:
0
My name is Cielo and I am 3.
1
My name is Vicky and I am 1.
可见,能够成功实现多层序列化。
Java中让fastJson识别Colloction和Map中的泛型类的更多相关文章
- golang中的slice翻转存在以及map中的key判断
//slice翻转 func stringReverse(src []string){ if src == nil { panic(fmt.Errorf("the src can't be ...
- Map java中的map 如何修改Map中的对应元素
Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map ...
- Java集合排序及java集合类详解--(Collection, List, Set, Map)
1 集合框架 1.1 集合框架概述 1.1.1 容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...
- 为 map 中不存在的 key 提供缺省值
需求 需要往一个复杂的 map 中写入数据,或为 map 中不存在 key 提供 default value java standard library Map<K, List<V> ...
- Java8中那些方便又实用的Map函数
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 java8之后,常用的Map接口中添加了一些非常实用的函数,可以大大简化一些特定场景的代码编写,提升代码可读性,一 ...
- 在map中一个key中存多个值
一说到map都想到key-value键值队存在.key可以为最多一个null的key. 今天开发中一个业务需求,在map中一个key中存多个对象. 我首先想到Map<String,List> ...
- go语言怎么从(json后的)多层map中取值
// 一个PHP中的多层关联数组,即Go中的多层map,如何从json字符串中解析,然后取到map中的某个具体的值. // 数据结构如下: cityInfo := "{ "stat ...
- java实体类和json串字段名称不一致或者与map中字段名称不一致使用注解转化
package yuanCheng; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List ...
- 浅谈Java中的Set、List、Map的区别(转)
对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java ...
随机推荐
- MySQL数据库中常用的引擎有几种?有什么区别?
1.常用的3种 2.InnoDB Myisam Memory 3.InnoDB跟Myisam的默认索引是B+tree,Memory的默认索引是hash 区别: 1.InnoDB支持事务,支持外键,支 ...
- SpringMVC拦截器及多拦截器时的执行顺序
本文链接:https://blog.csdn.net/itcats_cn/article/details/80371639拦截器的配置步骤 springmvc.xml中配置多个拦截器配置自定义拦截器并 ...
- GreenPlum 数据库启动关闭及数据库状态检查
本篇文章主要记录GreenPlum数据库的启动.关闭及状态查询.GreenPlum数据库提供gpstart和gpstop脚本来启动和关闭数据库,可以通过—help参数来查看这些脚本的帮助信息. vie ...
- 系列属性(offset、scroll、client)
一.offset系列属性 <div id="dv"></div> <!-- 已在style标签里设置div宽高各100px --> <sc ...
- Django系列(四):多表操作
1.创建模型 例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一(on ...
- 【概率论】5-3:超几何分布(The Hypergeomtric Distribution)
title: [概率论]5-3:超几何分布(The Hypergeomtric Distribution) categories: - Mathematic - Probability keyword ...
- 微信小程序环境下将文件上传到 OSS
步骤 1: 配置 Bucket 跨域 客户端进行表单直传到 OSS 时,会从浏览器向 OSS 发送带有 Origin 的请求消息.OSS 对带有 Origin 头的请求消息会进行跨域规则(CORS)的 ...
- Jira5.2.8 安装
第一步. 安装jira 1. 运行安装包,选择自定义安装 2. 最好使用netstat -ano检查一下端口是否被占用,如果占用就选其他的靓号吧~ 3. 选择集成数据库 输入应用的名称 第二步. 破解 ...
- CentOS定时运行脚本
1,新增脚本 如: vim /usr/local/crontab/clear_tomcat_log.sh 2, 修改权限 chomd 700 clear_tomcat_log.sh 3,调度任务: ...
- 使用java写js中类似setTimeout的代码
javascript目前已经是一门相当主流的编程语言了,它的异步IO特定项目其他编程语言来说,大大减少了cpu在线程切换方面的速度.实现了单线程高并发的奇迹.而java作为老牌编程语言,在很多的项目中 ...