去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 ...
随机推荐
- Java编程--单例(Singleton)设计模式
单例设计模式 一个类只有一个实例,根据创建的时机又分为懒汉式和饿汉式,它们的区别主要体现在实例的创建时机和线程安全性上. 饿汉式(Eager Initialization): 特点: 在类加载时就创建 ...
- Nacos源码—5.Nacos配置中心实现分析
大纲 1.关于Nacos配置中心的几个问题 2.Nacos如何整合SpringBoot读取远程配置 3.Nacos加载读取远程配置数据的源码分析 4.客户端如何感知远程配置数据的变更 5.集群架构下节 ...
- 操作系统综合题之“采用短进程优先调度算法(Shortest-Process-First,SPF)和先来先服务调度算法(First-Come,First-Served,FCFS)计算开始运行时间、结束时间、等待时间、周转时间、带权周转时间、平均周转时间”
一.问题:某系统中有四个进程,他们进入系统的时间和需要服务的时间如题下表所示(表中数值均为十进制) 进程 进入系统的时间 需要服务的时间 P1 0 100 P2 10 60 P3 25 25 P4 3 ...
- k8s之数据存储
查看k8s支持的存储类 kubectl explain pods.spec.volumes 1.emptydir kubectl explain pods.spec.volumes.emptyDir ...
- 模板导入_分页_cookie_装饰器_实例
程序目录 urls.py """s14_day21 URL Configuration"""from django.contrib impo ...
- SQL 日常练习(十五)
这两周真的是被客户搞怕了, 我一个数据分析师, 干着比程序员还复杂的活, 拿着文员的工资, 看这我每天下班的打卡时间, 感觉我一点求生欲都没有,真的不知道图啥. 快速理解业务, 马上建数据库表, 写后 ...
- Solon Ai Flow 编排开发框架发布预告(效果预览)
Solon Ai 在推出 Solon Ai Mcp 后,又将推出 Solon Ai Flow. 1.Solon Ai Flow 是个啥? Solon Ai Flow 是一个智能体编排开发框架(基于 s ...
- 【多线程】Java多线程与并发编程全解析
Java多线程与并发编程全解析 多线程编程是Java中最具挑战性的部分之一,它能够显著提升应用程序的性能和响应能力.本文将全面解析Java多线程与并发编程的核心概念.线程安全机制以及JUC工具类的使用 ...
- 【公众号搬运】React-Native开发鸿蒙NEXT
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- JAVA经典算法分析
算法分析是对一个算法需要多少计算时间和存储空间作定量的分析. 算法(Algorithm)是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法.在计算机科学中,算法要用计算机算法语言描述 ...