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 ... 
随机推荐
- sudo 命令报 unable to resolve host 导致反应速度变慢
			1 分析 1.1 字面分析,不能解析主机 1.2 由于修改了本地主机名称所导致 2 解决 2.1 打开 /etc/hosts 2.2 主机名称指向,如你的主机名为 debian 2.3 127.0. ... 
- 好用的Google Chrome插件
			juejin掘金 帮助我们随时了解Github上热门的项目,保证技术思想不掉队. Momentum 专注.待办清单…… Octotree Octotree 可以让我们在 Github 上浏览代码更加方 ... 
- hihoCoder 2 * problem
			1792 模拟,转化为二进制后逐位比较 1819 线段树维护区间加 维护每个数加了多少 每次弹出栈顶元素后栈顶位置注意清空 1792 #include <iostream> #includ ... 
- 【説明する】hash
			首先对于判重,我们能想到的方法有什么呢? 1)bool数组 2)set(集) 数组与集合的优缺点: 1.因为集合是对数组做的封装,所以,数组永远比任何一个集合要快. 2.数组声明了它容纳的元素的类型, ... 
- 小程序开发--API之登录授权逻辑
			小程序登录授权获取逻辑 原生的小程序提供许多开放接口供使用者开发,快速建立小程序内的用户体系. 下面将小程序校验.登录.授权.获取用户信息诸多接口串联起来,以便更直观的认识到这些接口是如何在实际应用中 ... 
- 修改input输入框的样式
			直接上代码 <style> .input{ -web-kit-appearance:none; -moz-appearance: none; font-size:1.4em; height ... 
- 小程序 之eval替代方案(Binding.js)
			一.下载 链接:https://pan.baidu.com/s/1D6vNSSBZI22_K1BzLEXpbg提取码:of6g 修改binding.js中的window.bind=binding为如下 ... 
- 小程序for循环
			https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/list.html 在什么情况下要自定义? 当上一个循环的数据 ... 
- C++生成DM数据点导入DM
			在c++编写正弦曲线点的代码,源代码如下: //想要使用内置的π,此句必不可少! #define _USE_MATH_DEFINES #include<iostream> #include ... 
- Oracle plsql 触发器 查询/启用/停止
			在PLSQL中查询某个表的触发器脚本 select * from user_triggers where table_name='xxx' oracle触发器的启用和停用 1.禁用 table_nam ... 
