关注微信公众号:CodingTechWork,一起学习进步。

介绍

模板需求说明

  开发中经常遇到前端传递过来的JSON串的转换,后端需要解析成对象,有解析成List的,也有解析成Map的。
  我们对Fastjson并不陌生,Fastjson 是阿里巴巴的开源JSON解析库。Fastjson可以看解析JSON格式的字符串,支持后端将Java Bean序列化成JSON字符串供给前端使用,也可以从前端传递过来的JSON字符串反序列化成Java Bean供给后端逻辑使用。

Fastjson依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version>
</dependency>

低版本漏洞

  由于低版本(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 );//字符串转换成第二级对象数组ListList<Map> 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<String, Object> map = JSONObject.parseObject(responseStr,Map.class);

转换List

Object obj = xxx;
String responseStr = JSON.toJSONString(obj);
List<Map> mapList = JSON.parseArray(responseStr , Map.class);
List<XXXBean> 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> T parseObject(String jsonStr, Class<T> clazz, Feature... features);// 2、将JSON字节反序列化为JavaBean对象public static <T> T parseObject(byte[] jsonBytes,  // UTF-8格式的JSON字符串Class<T> clazz, Feature... features);// 3、将JSON字符串反序列化为泛型类型的JavaBean对象public static <T> T parseObject(String text, TypeReference<T> 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<XXXBean>() {});Type type = new TypeReference<List<XXXBean>>() {}.getType();
List<XXXBean> 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—基于Fastjson的JSON串序列化和反序列化模板总结相关推荐

  1. java 转json_Java转JSON串的几种方式

    昨天在与对端系统调接口的时候,对端系统对我们传过去的json串老是处理不了,后来查原因是应为我们传过去的json串里有json对象数组,因为我们的json串存在表里的,取出来是作为json字符串放到j ...

  2. java newtonsoft.json_Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化. 创建 ...

  3. Json的序列化和反序列化

    1.引用命名空间: using System.Runtime.Serialization; 2.json的序列化和反序列化的方法: publicclass JsonHelper { ///<su ...

  4. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  5. 在C#中,Json的序列化和反序列化的几种方式总结

    在C#中,Json的序列化和反序列化的几种方式总结 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (Ja ...

  6. ASP.NET中JSON的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  7. Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化. 创建 ...

  8. Json.Net系列教程 3.Json.Net序列化和反序列化设置

    上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列 ...

  9. 一起谈.NET技术,ASP.NET 中JSON 的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

最新文章

  1. pandas中dataframe索引排序实战:pandas中dataframe索引降序排序、pandas中dataframe索引升序排序
  2. python 通过paramiko模块批量执行ssh命令
  3. android包内存放视频,Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...
  4. 前端学习(2026)vue之电商管理系统电商系统之实现分页功能
  5. 现在的年轻人,正在努力的改变着一些东西
  6. python输出回文字符串_程序,用于计算我们可以在Python中使用字符串字符进行的独特回文数...
  7. WriteFreely:创建博客,建立社区
  8. Selenium2用最简xpath查找元素
  9. Cadence Allegro 技巧实战视频之PCB封装库路径设置
  10. 机器学习需要的数据量需要怎么算
  11. 【小月电子】国产安路FPGA开发板系统学习教程-LESSON9简易测试系统
  12. 高级气泡图——R语言简单实现
  13. 经济基础知识(初级)【5】
  14. mysql查询雇员地址和电话_数据库的查询(结合YGGL.sql)
  15. 失去灵魂的百度还能撑几年?
  16. 银河麒麟服务器系统ip可ping通,但是tongweb的默认端口9060、8088不能访问,访问提示404
  17. Apollo无人驾驶课程笔记 第四课-感知
  18. MATLAB仿真Gough-Stewart并联机器人斯图尔特6自由度并联机器人逆运动学仿真 动力学控制pid控制
  19. vue中播放flv格式视频(b站flv.js的使用)
  20. 性能测试 Performance Test Report

热门文章

  1. AttributeError: ‘str‘ object has no attribute ‘copy
  2. 训练(training)和推理\推断(inference)的关系?
  3. 深度残差收缩网络:(四)注意力机制下的阈值设置
  4. laravel $request 多维数组取值_3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据...
  5. c++ 提取傅里叶描述子_非谐声子模拟方法(Normal Mode Decomposition)
  6. html5拨动密码锁游戏,密码锁游戏(JavaScript)
  7. 自旋锁 Linux内核,Linux内核中的自旋锁
  8. python做词云做文本处理_Python生成词云的制作
  9. 在html中用表单插入servlet 怎么写servlet的地址,java web中servlet、jsp、html 互相访问的路径问题。...
  10. java13性能,Spring Boot 2.2.0,性能提升+支持Java13