Java基础/利用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;
}
Java基础/利用fastjson反序列化json为对象和对象数组的更多相关文章
- Java基础/利用fastjson序列化对象为JSON
利用fastjson序列化对象为JSON 参考博客:http://blog.csdn.net/zeuskingzb/article/details/17468079 Step1:定义实体类 //用户类 ...
- Java安全之Fastjson反序列化漏洞分析
Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...
- Java下利用Jackson进行JSON解析和序列化
Java下利用Jackson进行JSON解析和序列化 Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...
- .NET中如何使用反序列化JSON字符串/序列化泛型对象toJsonStr
在进行 .NET Web MVC 框架开发的网站程序的时候,我们都会遇到最关键的问题,数据传输. .NET MVC 4中的ControllerBase类建议我们用ViewBag动态数据字典形式(t ...
- JAVA基础语法:函数(方法)、类和对象(转载)
4.JAVA基础语法:函数(方法).类和对象 函数 在java中函数也称为方法,是一段具备某种功能的可重用代码块. 一个函数包括这几部分: 函数头 函数头包括函数访问修饰符,函数返回值类型, 函数名, ...
- Java基础—序列化与反序列化(转载)
转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...
- FastJson解析Json,封装JavaBean对象
获取到前端的Json,后台对应封装JavaBean对象,对其解析赋值 获取到前端的json,对其进行分析 1.获取最外层前端json对应得JavaBean (1)未分析格式的json串 (2)初步格式 ...
- 【踩坑】利用fastjson反序列化需要默认构造函数
利用 fastjson等 反序列化时需要注意,他可能会用到 默认的构造函数,如果没有默认构造函数,某些场景下可能会出现 反序列化熟悉为空的情况,如下图所示:
- Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...
随机推荐
- octave-bug - 报告 GNU Octave 中的 bug
SYNOPSIS 总览 octave-bug [-s subject] DESCRIPTION 描述 octave-bug 是一个 shell 脚本,用于以一种标准的格式撰写有关 Octave 的 b ...
- makeinfo - 翻译 Texinfo 文档
SYNOPSIS 总览 makeinfo [OPTION]... TEXINFO-FILE... DESCRIPTION 描述 将 Texinfo 源文档翻译为各种其他格式,默认是可以用 Emacs ...
- linux c下的c文件 h文件 o文件 so文件 a文件 可执行文件 gcc使用
linux下c语言工程: c文件:主要每个模块的原代码都在c文件中. h文件:每个c文件都跟着一个h文件,h文件的作用是放着c文件中函数的声明,结构体的定义,宏的定义等. o文件:目标文件.每个文件经 ...
- tee 多重定向
1.命令功能 tee读取标准输入的数据,并将内容输出成文件. 2.语法格式 tee option file tee [-ai] 文件 参数说明 参数 参数说明 -a 追加到文件后面,非覆盖 - ...
- Codeforces 940 区间DP单调队列优化
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- shell脚本中oldIFS=$IFS
https://blog.csdn.net/champwang/article/details/54670293 转自https://man.linuxde.net/shell-script/shel ...
- springboot 初探 、基础及配置
一.spring boot 的核心功能 独立运行的spring项目.内嵌servlet容器.提供starter简化maven配置.自动配置Spring.准生产的应用监控.无代码生成和xml配置二.sp ...
- css使既有浮动又有左右margin的多个元素两端对其
两端对齐效果 如上图中红色的9个div它们中间有间距,而最左边和最右边是没有间距的,这种布局如果使用css3的flex来实现是非常简单的,而如果要使用float布局就需要一些特殊的技巧了. 实现原理 ...
- DevExpress v19.1新版亮点——WinForms篇(三)
行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...
- C++ GUI Qt4学习笔记04
本章将实现应用程序的功能,通过编写底层函数来完成之前的Spreadsheet程序,关于如何载入和保存文件,如何在内存中存储数据,如何实现剪贴板的操作以及如何向QTableWidget中添加对电子指标软 ...