去fastjson笔记
fastjson近些年频频爆出安全漏洞,现在已经是互联网的过街老鼠了,建议早去早好,网上搜索了下,相对而言google出品的gson目前还没听说有重大安全问题。下面是gson替换fastjson可能会遇到的一些坑。
一、美化输出格式
new GsonBuilder().setPrettyPrinting().create();
二、自定义date的输出格式
new GsonBuilder()
.setPrettyPrinting() //美化输出格式
.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS") //设置date字段的输出格式
.create();
写一段单元测试代码:
package test.nio.study; import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test; import java.util.*; public class GsonTest { public Gson gson() {
return new GsonBuilder()
.setPrettyPrinting() //美化输出格式
.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS") //设置date字段的输出格式
.create();
} @Data
@NoArgsConstructor
public class InnerTestClass {
private Integer intField;
private Long longField;
private String strField;
private Date dateField;
private List<InnerTestClass> listField;
private Map<String, String> mapField;
} @Test
public void testGson() {
InnerTestClass test = new InnerTestClass();
test.intField = 1;
test.longField = 2L;
test.dateField = new Date();
test.mapField = new HashMap<>();
test.mapField.put("test", "hello world");
test.listField = new ArrayList<>(); InnerTestClass test2 = new InnerTestClass();
test2.dateField = new Date();
test.listField.add(test2); System.out.println(gson().toJson(test));
}
}
输出如下:
{
"intField": 1,
"longField": 2,
"dateField": "2020-06-14 23:04:17.202",
"listField": [
{
"dateField": "2020-06-14 23:04:17.202"
}
],
"mapField": {
"test": "hello world"
}
}
三、兼容多种date字符串/timestamp的反序列化
{
"dateField": "2020-06-14 23:04:17",
"listField": [
{
"dateField": "2020-06-14 23:04:17.202"
},
{
"dateField": 1592148201102
},
{
"dateField": ""
}
]
}
如果上面这段json,尝试用刚才生成的gson实例反序列化的话,会报错Invalid time zone indicator ' ',原因是 第1个dateField没有带.SSS的毫秒部分,第3个dateField是一个timestamp的long型数字,更无法匹配yyyy-MM-dd HH:mm:ss.SSS,第4个是空字符串,仍然无法匹配。
可以参考下面这样:
public Gson gson() {
String dateFormatWithMS = "yyyy-MM-dd HH:mm:ss.SSS";
String dateFormatNoMS = "yyyy-MM-dd HH:mm:ss";
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> {
if (json == null || json.toString().equalsIgnoreCase("\"\"")) {
//空字符判断
return null;
}
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
SimpleDateFormat sdfMS = new SimpleDateFormat(dateFormatWithMS);
SimpleDateFormat sdfNoMS = new SimpleDateFormat(dateFormatNoMS);
Date dt = null;
try {
if (jsonPrimitive.isString()) {
if (jsonPrimitive.getAsString().length() == 19) {
//这里只是示例,简单用长度来判断是哪种格式
//yyyy-MM-dd HH:mm:ss格式
dt = sdfNoMS.parse(json.getAsString());
} else {
//yyyy-MM-dd HH:mm:ss.SSS格式
dt = sdfMS.parse(json.getAsString());
}
} else if (jsonPrimitive.isNumber()) { //兼容timestamp类型
dt = new Date(jsonPrimitive.getAsLong());
}
} catch (Exception e) {
//错误日志记录,略
e.printStackTrace();
}
return dt;
});
Gson gson = builder
.setDateFormat(dateFormatWithMS)
.setPrettyPrinting()
.create();
return gson;
}
这样,刚才这4种情况的date解析都能兼容了。
四、字段别名
@SerializedName(value = "int_field", alternate = {"aaa", "bbb"})
private Integer intField;
这样的话,json字符串中的int_field, aaa, bbb这3种名字,都能映射到intField上。
五、数组解析
@Test
public void testParseList() {
String json = "[\"A\",\"B\",\"C\"]";
List<String> list1 = gson().fromJson(json, new TypeToken<List<String>>() {
}.getType());
System.out.println(list1.size());
}
TypeToken是个很有用的东西,建议大家多研究。
注:关于Calendar类型的定制,可参考我的另一篇文章 Gson如何自定义Calendar序列化/反序列化
去fastjson笔记的更多相关文章
- 一、MarkDown学习笔记
MakrDown学习 MarkDown是什么? 是一种纯文件格式的标记语言,跟我们写txt和word是一样的,不过它有一些简单的标记,可以使普通文本具有一定的格式. MarkDown有什么样式? 样式 ...
- OI总结(垃圾排版就忽略了吧)
学OI一年了,到现在联赛所需要的知识已经基本学完了.现在,有必要回过头来,总结总结自己一年来学到的知识以及得到的经验教训. 基础 语言基础 C++的语言基础啥的就略了吧. 算法复杂度分析 O:复杂度的 ...
- 重拾C,一天一点点_4_随想
刚才顺便又把二分默写了一遍,还好,这次比较顺利.算法这一块,一直是自己一块痛处,有时感觉自己的脑瓜子怎么就这么笨,后一想觉得肯定是锈逗了,确实啊,这么长时间不思考的脑子能机灵到哪呢?早就意识到这个问题 ...
- 5th day
感觉mysql里面的东西好多,很容易忘记,不是很熟练,知道某些函数有某种功能,但就是想不起来函数的名字,需要去翻笔记,真的还需要大量的练习,毕竟这块的内容可以说是全新的...不知道后面做项目怎么样,这 ...
- HTML的框架,表格
#2 HTML的框架,表格 [以下是个人笔记,由于水平有限,因此有错误的地方,希望M我.谢谢] 表格|表单|框架---------------表格:布局 ----现在很少用到好处: 适合做 ...
- Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)
前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...
- python_adb 图形界面获取app测试数据,并展示部分测试报告v1.0版本
想到平时想用adb 我就忍不住去翻开笔记,脑子记不住,不好使,不知道大家有没有这个想法呢,不管你有没有,反正我有了,ttm,太烦人了,于是乎,我就开始给自己写个需求文档, 这就是我写的,产品需求,合理 ...
- 写给IT技术爱好者的一封信
写给IT技术爱好者的一封信>当前运维素质的分析<... ---------------------- 虽相貌平平,但勤学苦练,亦收获颇丰!如果你决定要成为一名IT从业者,你需要承受以下的东 ...
- python 全栈开发,Day93(vue内容补充,VueX)
昨日内容回顾 1. 页面的布局 Vue中使用Bootstrap搭页面 1. 安装 1. npm install bootstrap@3.3.7 -S 2. 使用 1. import 'bootstra ...
- html+css实现小米商城首页静态页面
学了一个星期的html和css,用新学的东西写点东西,仿照小米商城的首页按照它的页面布局盗用它的图片写了个小米商城的静态页面. 源代码:链接:https://pan.baidu.com/s/1qf63 ...
随机推荐
- ArcGIS Desktop 10.7 完美汉化安装教程
1,下载文件并解压缩,双击[Esri ArcGIS Desktop v10.7.0.exe] 2.在安装向导中选择[Next] 3.选中[I accept the master agreement]我 ...
- [数据库/SQL] 浅谈DDL、DSL、DCL、DML、DQL
概念辨析:SQL.DQL.DML.DDL.DCL SQL(Structure Query Language, 结构化查询语言)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下 ...
- Tomcat无法启动报错:'Starting Tomcat v9.5 Server at localhost' has encountered a problem
错误提示 控制台提示 严重: A child container failed during start java.util.concurrent.ExecutionException: org.ap ...
- Java--Calendar类,Date类的简单使用,日期的格式化
package demo; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; / ...
- netcore限流
netcore限流 using System; using System.Collections.Generic; using System.Threading.Tasks; using Micros ...
- 远程服务器(腾讯云轻量服务器)上安装SQL Server以及SQL Server Management Studio,以及EFCore对其的连接
SQL Server的安装 下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 安装教程参考:https://bl ...
- AtCoder Beginner Contest 382-E
Problem 有无数包牌,每包有 \(N\) 张牌.在每一包牌中, 第 \(i\) 张牌是稀有牌,概率为 \(P_i\%\).每张牌是否稀有与其他牌是否稀有无关. 逐一打开包装,并获得每包中的所有卡 ...
- Java代码审计SpEL表达式注入
SpEL表达式概念 Spring Expression Language(SpEL) 是 Spring Framework 提供的一种功能强大的表达式语言,全称为 Spring Expression ...
- Centos通过crontab配置定时任务
一.简单说明 我们在实际使用Centos系统的过程中,可能会涉及一些定时任务的操作,比如定时清理环境上的垃圾文件.这里我遇到的一个问题就是,CI环境上构建的Docker IMAGE的清理,这里我采用了 ...
- AI 运维诊断全攻略,深入浅出 OceanBase 系列直播重磅来袭!
社区的 #数据库 与 #AI 爱好者们 当 SQL 遇见 AI 的系列直播即将开启! 今晚 19:30,聚焦#AI 时代的运维与诊断,带你共享 #大模型辅助数据库运维 的一线实战经验,探索 #Ocea ...