利用fastjson反序列化json为对象和对象数组
Posted kaixinyufeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用fastjson反序列化json为对象和对象数组相关的知识,希望对你有一定的参考价值。
利用fastjson反序列化json为对象和对象数组
利用 fastjosn 将 .json文件 反序列化为 java.class 和 java.util.List
fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。
【主要特点】
1、快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
2、强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
3、零依赖(没有依赖其它任何类库除了JDK) —— [ 开源中国社区]
一、反序列化函数
1、parseObject [将 json字符串 反序列化为 java.class]
//transform the json to T
-fastjson 为 json格式的字符串(String类型)
-T 为 与 json格式对应的自定义java.class @sherineZJU List<T> temp= JSON.parseObject(fastjson,T.class);
2、parseArray[将 json字符串 反序列化为 java.util.List]
//transform the json to List<T>
-fastjson 为 json格式的字符串(String类型) -List< T> 为 与 json格式对应的 自定义 java.util.List。 @sherineZJU List<T> oldk = JSONArray.parseArray(fastjson,T.class);
注意:json字符串的关键字一定要与 java.class 中的对应变量名相同
实例1:JSON转化为HashMap&ArrayList
【0】首先在Maven中引入fastjson(pom.xml中引入依赖)
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.0.4</version> </dependency>
注:若未应用Maven,可以下载Jar包
http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.0.4/fastjson-1.0.4.jar
http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.0.4/fastjson-1.0.4-sources.jar
【1】定义实体类
//定义实体类 public class PlatformModel { private String id; private String name; private String platcode; //增加get/set方法 }
【2】定义测试方法
public class Test { String platforms = "[{\'id\':\'0\',\'name\':\'A\',\'platcode\':\'p1\'}," + "{\'id\':\'1\',name:\'B\',\'platcode\':\'p2\'}," + "{\'id\':\'2\',name:\'C\',\'platcode\':\'p3\'}," + "{\'id\':\'3\',name:\'D\',\'platcode\':\'p4\'}]"; //其中key为id,值为对象自己 private Map<String, PlatformModel> platformMap = new HashMap<>(); //存储集合的ArrayList private ArrayList<PlatformModel> platformList = new ArrayList<>(); //转换字符串为Java对象集合(HashMap存储) private Map<String, PlatformModel> getPlatformMap() { JSONArray platformArray = JSON.parseArray(platforms); for (Object jsonObject : platformArray) { PlatformModel platformModel = JSONObject.parseObject(jsonObject.toString(), PlatformModel.class); platformMap.put(platformModel.getId(), platformModel); } return platformMap; } //转换字符串为Java对象集合(ArrayList存储) private ArrayList<PlatformModel> getPlatformList() { JSONArray platformArray = JSON.parseArray(platforms); for (Object jsonObject : platformArray) { PlatformModel platformModel = JSONObject.parseObject(jsonObject.toString(), PlatformModel.class); platformList.add(platformModel); } return platformList; } public static void main(String[] args) { Test test = new Test(); test.getPlatformMap(); test.getPlatformList(); }
【3】输出结果
&&
项目实例实现:获取属性文件JSON值,并转换成对象返回前端(用户菜单权限)
Step1:定义实体类
//用户账号表 public class AccountUser implements Serializable { private static final long serialVersionUID = 7247714666080613254L; private String pin; private String traceaccount; private Boolean isAdmin; private List<Menu> menus; //增加get/set方法 }
//菜单表 public class Menu { private String type; private String index; private String name;//菜单名 private boolean expanded; private String icon; private String link; private List<Menu> children;//子菜单 //增加get/set方法 }
Step2:配置属性文件menus值
//在config.porperties中引入JSON值,JSON值可用JSON压缩转义工具压缩为1行 menus= [{ type: \'group\', index: \'menu1_1\', name: \'菜单A\', expanded: false, children: [{ type: \'link-item\', index: \'menu1\', name: \'菜单A-1, expanded: false, icon: \'area-chart\', link: \'/menu1\', children: [] }, { type: \'link-item\', index: \'menu2\', name: \'菜单A-2\', expanded: false, icon: \'phone\', link: \'/menu2\', children: [] }, ] }]
Step3:获取属性文件值
//框架自定义方式 public class SwitchConfigBean extends BaseConfig implements ConfigDomainInitBean, java.io.Serializable{ private String menus= PropertyConfigurer.getProperty("menus"); //menus的get/set方法 //重写toString()方法 }
Step4:将JSON转化为对象返回【核心】
public AccountUser getAccountUser(String pin) { /* 1.根据pin获取traceaccount 2.判断traceaccount是否存在,若存在则获取该pin是否是管理员身份 3.根据pin获取是否是管理员 4.根据pin获取menu权限 */ AccountUser accountUser = new AccountUser(); //验证是否具有访问系统权限 if(ArrayUtils.contains(ResourceContainer.switchConfigBean.getSystemPrivilegers(), pin)){ String traceaccount = accountUserMapper.getTraceAccountByPin(pin); if (traceaccount != null) { accountUser.setPin(pin); accountUser.setTraceaccount(traceaccount); //验证当前登录PIN是否为管理员身份 if (ArrayUtils.contains(ResourceContainer.switchConfigBean.getPrivilegers(), pin)) { accountUser.setAdmin(true); } else { accountUser.setAdmin(false); } //根据pin获取菜单权限,先从配置文件获取菜单权限 JSONArray menuArray = JSON.parseArray(ResourceContainer.switchConfigBean.getMenus()); if(!menuArray.isEmpty()){ ArrayList<Menu> menus= new ArrayList<>(); for (Object jsonObject : menuArray) { Menu menu = JSONObject.parseObject(jsonObject.toString(), Menu.class); menus.add(menu); } accountUser.setMenus(menus); } } } return accountUser; }
以上是关于利用fastjson反序列化json为对象和对象数组的主要内容,如果未能解决你的问题,请参考以下文章