由于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中的泛型类的更多相关文章

  1. golang中的slice翻转存在以及map中的key判断

    //slice翻转 func stringReverse(src []string){ if src == nil { panic(fmt.Errorf("the src can't be ...

  2. Map java中的map 如何修改Map中的对应元素

    Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.         Map的接口         Map ...

  3. Java集合排序及java集合类详解--(Collection, List, Set, Map)

    1         集合框架 1.1         集合框架概述 1.1.1         容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...

  4. 为 map 中不存在的 key 提供缺省值

    需求 需要往一个复杂的 map 中写入数据,或为 map 中不存在 key 提供 default value java standard library Map<K, List<V> ...

  5. Java8中那些方便又实用的Map函数

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 java8之后,常用的Map接口中添加了一些非常实用的函数,可以大大简化一些特定场景的代码编写,提升代码可读性,一 ...

  6. 在map中一个key中存多个值

    一说到map都想到key-value键值队存在.key可以为最多一个null的key. 今天开发中一个业务需求,在map中一个key中存多个对象. 我首先想到Map<String,List> ...

  7. go语言怎么从(json后的)多层map中取值

    // 一个PHP中的多层关联数组,即Go中的多层map,如何从json字符串中解析,然后取到map中的某个具体的值. // 数据结构如下: cityInfo := "{ "stat ...

  8. java实体类和json串字段名称不一致或者与map中字段名称不一致使用注解转化

    package yuanCheng; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List ...

  9. 浅谈Java中的Set、List、Map的区别(转)

    对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java ...

随机推荐

  1. sublime 分屏显示 不是插件

    点击 view--layout --- 选择几屏即可(single / columns 2 ....) 快捷键  Alt + Shift + 1/2/3/4  分别对应1 ,2,3,4屏 如何把一个文 ...

  2. NuGet本地包自定义路径

    <?xml version="1.0" encoding="utf-8"?> <configuration> <packageSo ...

  3. 树状数组例题-数星星,简单题easy,校门外的树2,清点人数

    [例1]数星星 天空中有一些星星,这些星星都在不同的位置,每个星星都有个坐标,如果一个星星的左下方(包括正左和正下)有k颗星星,就说这颗星星是k级的. 比如,上图中,星星5是3级的(1,2,4在其左下 ...

  4. 006_硬件基础电路_MOS管

    从文档中提取有用信息 链接:https://pan.baidu.com/s/1fR7ZyGDgapOdd-FtjQ6m8Q提取码:an11 复制这段内容后打开百度网盘手机App,操作更方便哦 判断三个 ...

  5. ES WIndows 安装 ES与ES-head

    一.ES的安装 1.到ES官网下载ES 安装ES前,需要安装JDK1.8以上版本 https://www.elastic.co/downloads/elasticsearch 2.解压ES 3.安装E ...

  6. 不用中间变量交换a和b的值?

    a = b = a = a+b b = a-b a = a-b print(a,b) a = b = a = a^b b = b^a a = a^b print(a,b) a = b = a,b = ...

  7. C++标准库分析总结(一)

    之前学习过标准库,最近身边有人问到相关话题,故在此做一个总结 1 标准库介绍 C++标准库:C++ Standard Library C++标准模板库:Standard Template Librar ...

  8. ZR#988

    ZR#988 解法: 先算出横着能排多少座位, 以及需要排几列, 才能把 n 个座位全部排下来.要使得尽量多的位置在走廊边上, 于是在 n 列中插入走廊的策略是显然的, 我们只要以两列为单位, 在其中 ...

  9. vue点击父组件里面的列表动态传值到子组件

    <template> <div> 爸爸 <div style="background-color:yellow;margin-top:10px" v- ...

  10. 在使用avalon框架的时候,用ms-duplex双工绑定,在template上是有数据渲染的,但是js里面却是undefined

    controller绑定是用于圈定某个VM的作用域范围,因为有的页面,你用的对象一致,而这两个作用域里面有相同的数据,那么很有可能是另一个作用域里面的东西影响了这个作用域,所以在指定作用域的给不同的命 ...