java json 转map_JAVA | 基于Fastjson的JSON串序列化和反序列化模板总结
介绍
模板需求说明
开发中经常遇到前端传递过来的JSON串的转换,后端需要解析成对象,有解析成List的,也有解析成Map的。
我们对Fastjson并不陌生,Fastjson 是阿里巴巴的开源JSON解析库。Fastjson可以看解析JSON格式的字符串,支持后端将Java Bean序列化成JSON字符串供给前端使用,也可以从前端传递过来的JSON字符串反序列化成Java Bean供给后端逻辑使用。
Fastjson依赖
com.alibabafastjson1.2.70
低版本漏洞
由于低版本(version <= 1.2.68
)的fastjson存在远程代码执行漏洞,该bug可以被利用直接获取服务器权限。
漏洞修复方案
引入高版本后(version >= 1.2.69
),前后端交互的bean中会出现循环引用,因此我们需要在工程的Application类中main函数中添加以下代码禁止循环引用检测。
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
除了引入高版本,我们还可以通过配置开启SafeMode来防护攻击,完全禁用autoType,无视白名单,这会对业务有一定影响。
ParserConfig.getGlobalInstance.setSafeMode(true);
解析模板
Response获取成String
public static String getResponseAsString(final HttpResponse response) {try {return EntityUtils.toString(response.getEntity(), "UTF-8"); } catch (final ParseException e) {throw new RuntimeException(e); } catch (final IOException e) {throw new RuntimeException(e); } }
JSON串解析
若已通过上述的Response方法转换成了String类型字符串为appsStr
。
JSON示例
JSON转换对象
try {//获取第一级对象 JSONObject appsJSONObject = JSON.parseObject(appsStr).getJSONObject("apps");//判断是否为空if (appsJSONObject == null || appsJSONObject .size() <= 0) { log.info("json has no apps"); }//获取第二级对象数组JSONArray JSONArray appJSONArray = appsJSONObject .getJSONArray("app");//转换成二级对象字符串 String appStr = JSON.toJSONString(appJSONArray );
//字符串转换成第二级对象数组List List appList = new ArrayList<>(); appList = JSONObject.parseArray(appStr, Map.class); log.info("length: {}", appList.size());} catch (Exception e) { log.error(e.getMessage()); }
常用三类转换
转换bean对象
//其他方式获取到的Object对象Object obj = xxx;String responseStr = JSON.toJSONString(obj);XXXXBean xxxxBean = JSON.parseObject(responseStr, XXXXBean.class);
转换Map
Object obj = xxx;String responseStr = JSON.toJSONString(obj);Map map = JSONObject.parseObject(responseStr,Map.class);
转换List
Object obj = xxx;String responseStr = JSON.toJSONString(obj);List mapList = JSON.parseArray(responseStr , Map.class);List xxxList = JSONObject.parseArray(responseStr, XXXBean.class);
FastJson API
序列化API
package com.alibaba.fastjson;
public abstract class JSON {// 1、toJSONString():将Java对象object序列化为JSON字符串,支持各种各种Java基本类型和JavaBeanpublic static String toJSONString(Object object, SerializerFeature... features);// 2、toJSONBytes():将Java对象object序列化为JSON字符串,按UTF-8编码返回JSON字符串bytespublic static byte[] toJSONBytes(Object object, SerializerFeature... features);// 3、writeJSONString():将Java对象object序列化为JSON字符串,写入到Writer中public static void writeJSONString(Writer writer, Object object, SerializerFeature... features);
// 4、writeJSONString():将Java对象object序列化为JSON字符串,按UTF-8编码写入到OutputStream中public static final int writeJSONString(OutputStream os, // Object object, // SerializerFeature... features);
}
反序列化API
package com.alibaba.fastjson;
public abstract class JSON {// 1、将JSON字符串jsonStr反序列化为JavaBean对象public static T parseObject(String jsonStr, Class clazz, Feature... features);// 2、将JSON字节反序列化为JavaBean对象public static T parseObject(byte[] jsonBytes, // UTF-8格式的JSON字符串 Class clazz, Feature... features);// 3、将JSON字符串反序列化为泛型类型的JavaBean对象public static T parseObject(String text, TypeReference type, Feature... features);// 4、将JSON字符串反序列为JSONObjectpublic static JSONObject parseObject(String text);}
模板
序列化模板
JavaBean —> JSON String
import com.alibaba.fastjson.JSON;
XXXBean xxxBean = ...;String jsonStr = JSON.toJSONString(xxxBean);
JavaBean —> JSON Bytes
import com.alibaba.fastjson.JSON;
XXXBean xxxBean = ...;byte[] jsonBytes = JSON.toJSONBytes(xxxBean);
JavaBean —> JSON Writer
import com.alibaba.fastjson.JSON;
XXXBean xxxBean = ...;Writer writer = ...;JSON.writeJSONString(writer, xxxBean);
JavaBean —> JSON OutputStream
import com.alibaba.fastjson.JSON;
XXXBean xxxBean = ...;OutputStream outputStream = ...;JSON.writeJSONString(outputStream, xxxBean);
反序列化模板
JSON String —> JavaBean
import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;
String jsonStr = ...;XXXBean xxxBean = JSON.parseObject(jsonStr, XXXBean.class);
JSON Bytes —> JavaBean
import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;
byte[] jsonBytes = ...;XXXBean xxxBean = JSON.parseObject(jsonBytes, XXXBean.class);
JSON Generic Type —> JavaBean
import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;String jsonStr = ...;XXXBean xxxBean = JSON.parseObject(jsonStr, new TypeReference() {});Type type = new TypeReference>() {}.getType();List list = JSON.parseObject(jsonStr, type);
JSON String —> JavaBean
import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;
String jsonStr = ...;JSONObject jsonObj = JSON.parseObject(jsonStr);
[每篇微语]
做人凡事要静,静静地来,静静地去,静静努力,静静收获,切忌喧哗。
— 亦舒
java json 转map_JAVA | 基于Fastjson的JSON串序列化和反序列化模板总结相关推荐
- Java—基于Fastjson的JSON串序列化和反序列化模板总结
关注微信公众号:CodingTechWork,一起学习进步. 介绍 模板需求说明 开发中经常遇到前端传递过来的JSON串的转换,后端需要解析成对象,有解析成List的,也有解析成Map的. 我 ...
- gson json转map_Java几种常用JSON库性能比较
点击上方"Java研发军团",选择"置顶公众号" 关键时刻,第一时间送达! 阅读本文需要5分钟 作者:飞污熊 xncoding.com/2018/01/09/j ...
- Java泛型之mybatis,基于spring MVC 和 MyBatis 泛型的代码生成模板
原标题:基于spring MVC 和 MyBatis 泛型的代码生成模板 简单说明 这块代码生成工具是我抽空的时候方便自己使用而编写的,并不适合其他框架,这里由于项目原有,我并没有上传泛型部份的代码, ...
- FastJson实现复杂对象序列化与反序列化
一.认识FastJson 1.优势 fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果说明比gson快大约6倍,fastjson采用独创的算法 ...
- java json格式字符串转为map_json格式的字符串序列化和反序列化的一些高级用法...
(1) 仅仅将指定属性对应的值序列化成字符串: var filter = {name: 'Jerry', sex: 'male', age: '10'}; var jsonStr4 = JSON.st ...
- java实现序列化接口6_只有实现 Java.io. 接口的类的对象才能被序列化和反序列化。用关键字 修饰的对象变量将不会序列化。_程序设计基础(C#)答案_学小易找答案...
[填空题]7.分时系统时,时间片选的太小会导致运行时间过慢的现象,因此,时间片的大小一般选择为略( 1 )一次典型的交互所需的时间. [单选题]5-6. 我们如果为每一个作业只建立一个进程,则使作业的 ...
- 序列化对象C++对象的JSON序列化与反序列化探索
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...
- ASP.NET中JSON的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- ASP.NET MVC Json的序列化和反序列化
1.利用js进行序列化成字符串和反序列化 1 var personObj = {name:"Tom",age:16}; 2 3 // 利用JS序列化成字符串 4 var perso ...
- 一起谈.NET技术,ASP.NET 中JSON 的序列化和反序列化
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
最新文章
- 为什么数据库连接池不采用IO多路复用?
- LPSTR与char*的转换
- 嵌入式系统开发者需要掌握什么技术?
- 【C++基础学习】C++引用参数与指针参数
- 2017河北对口计算机试题,2017河北省对口升学计算机专业理论试题(附答案解析).doc...
- HDU 2563 统计问题 (DFS + 打表)
- javaweb不同用户登录不同页面的页面_Java Web轻松学36 - 第二个Servlet应用租房网(1)...
- 从实际项目出发,告诉你vue3到底香不香
- 消费者生产者问题,哲学家问题
- buctoj-python 2022.6.19
- 组建计算机网络的硬件设备,计算机网络的硬件组成中包含了哪些硬件设备
- C语言记录按键次数,【视频】C语言实现键盘记录【c语言吧】_百度贴吧
- a-table及相关组件的使用
- 取小数点前两位,并四舍五入
- Python制作爱心跳动代码,这就是程序员的烂漫吗
- ArcGIS用土地利用数据导出shp
- 总谐波失真80_如何将总谐波失真(THD)控制着10%以下?
- 推荐四款可视化工具,解决99%的可视化大屏需求
- 地大计算机学院田甜,【学霸画像】第七十一期—记计算机学院2013级本科生詹才韬...
- Word 自带公式转为mathtype格式
热门文章
- Atitit.jquery 版本新特性attilax总结
- atitit.提升开发效率---动态语言总结
- paip.本机CVS环境搭建
- 阿里云linux上安装,卸载mysql与重新安装配置Mysql
- mut a:T 和a:mut T的区别
- 【Rust学习笔记】Rust生命周期参数的详细阐述
- 贝莱德COO:作为全球最大资产管理公司,为什么说我们还是成长中的科技公司?
- 小银行忍痛放弃资管业务? 转型渠道代销是大势所趋
- Rust : codewars的Product of consecutive Fib numbers
- Julia: 关于... (三个圆点)