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笔记的更多相关文章

  1. 一、MarkDown学习笔记

    MakrDown学习 MarkDown是什么? 是一种纯文件格式的标记语言,跟我们写txt和word是一样的,不过它有一些简单的标记,可以使普通文本具有一定的格式. MarkDown有什么样式? 样式 ...

  2. OI总结(垃圾排版就忽略了吧)

    学OI一年了,到现在联赛所需要的知识已经基本学完了.现在,有必要回过头来,总结总结自己一年来学到的知识以及得到的经验教训. 基础 语言基础 C++的语言基础啥的就略了吧. 算法复杂度分析 O:复杂度的 ...

  3. 重拾C,一天一点点_4_随想

    刚才顺便又把二分默写了一遍,还好,这次比较顺利.算法这一块,一直是自己一块痛处,有时感觉自己的脑瓜子怎么就这么笨,后一想觉得肯定是锈逗了,确实啊,这么长时间不思考的脑子能机灵到哪呢?早就意识到这个问题 ...

  4. 5th day

    感觉mysql里面的东西好多,很容易忘记,不是很熟练,知道某些函数有某种功能,但就是想不起来函数的名字,需要去翻笔记,真的还需要大量的练习,毕竟这块的内容可以说是全新的...不知道后面做项目怎么样,这 ...

  5. HTML的框架,表格

    #2 HTML的框架,表格   [以下是个人笔记,由于水平有限,因此有错误的地方,希望M我.谢谢] 表格|表单|框架---------------表格:布局     ----现在很少用到好处: 适合做 ...

  6. Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

    前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...

  7. python_adb 图形界面获取app测试数据,并展示部分测试报告v1.0版本

    想到平时想用adb 我就忍不住去翻开笔记,脑子记不住,不好使,不知道大家有没有这个想法呢,不管你有没有,反正我有了,ttm,太烦人了,于是乎,我就开始给自己写个需求文档, 这就是我写的,产品需求,合理 ...

  8. 写给IT技术爱好者的一封信

    写给IT技术爱好者的一封信>当前运维素质的分析<... ---------------------- 虽相貌平平,但勤学苦练,亦收获颇丰!如果你决定要成为一名IT从业者,你需要承受以下的东 ...

  9. python 全栈开发,Day93(vue内容补充,VueX)

    昨日内容回顾 1. 页面的布局 Vue中使用Bootstrap搭页面 1. 安装 1. npm install bootstrap@3.3.7 -S 2. 使用 1. import 'bootstra ...

  10. html+css实现小米商城首页静态页面

    学了一个星期的html和css,用新学的东西写点东西,仿照小米商城的首页按照它的页面布局盗用它的图片写了个小米商城的静态页面. 源代码:链接:https://pan.baidu.com/s/1qf63 ...

随机推荐

  1. Burp插件Fiora联动nuclei(windows)

    大佬写的插件出来好久了 今天朋友问我Fiora联动nuclei,我突然忘了咋配的的了.. 记录一下 一.下载nuclei https://github.com/projectdiscovery/nuc ...

  2. Linux系统的一些基本文件和目录管理命令

    pwd:查看当前目录所在位置. ls:查看当前目录下的文件和目录.例如我们查看根目录下的文件和目录: (注:蓝字的是目录,白字的是文件,绿字的是可执行的文件或装有可执行文件的目录,红字是压缩包) 如果 ...

  3. 思科安全大模型SOC作业应用分析

    思科与Meta联合推出的 Foundation-sec-8B 大模型及 AI Defenders工具包,标志着AI技术在网络安全领域的深度融合与创新突破.两者的协同不仅重构了传统安全运营模式,更开创了 ...

  4. Pytorch之Tensor学习

    Pytorch之Tensor学习 Tensors是与数组和矩阵类似的数据结构,比如它与numpy 的ndarray类似,但tensors可以在GPU上运行.实际上,tensors和numpy数组经常共 ...

  5. java从小白到老白①

    计算机:由软件和硬件组成.其中没有安装任何软件的电脑称为裸机 (1)计算机硬件是指系统中由电子,机械和光电元件等组成的各种物理装置的总称.这些物理装置按系统结构的要求构成一个有机整体为计算机软件提供物 ...

  6. RC4加密解密算法工具类-Java语言实现

    摘要 RC4加密解密算法是工具类是大名鼎鼎的 RSA三人组中的头号人物Ron Rivest设计的,可以有效抵御暴力搜索密钥的攻击.鉴于此,提供一个由Java语言实现的工具类. 前言   RC4加密算法 ...

  7. Go中的interface(接口)

    接口 接口(interface)定义了一个对象的行为规范,之定义规范不实现,由具体的对象来实现规范的细节. 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型. interfa ...

  8. (各种数组之间的互相转换)int 数组与List互相转换,object数组转换int数组

    Stream流之List.Integer[].int[]相互转化 一.int[ ] 1.1.int[ ] 转 Integer[ ] public static void main(String[] a ...

  9. [书籍精读]《CSS世界》精读笔记分享

    写在前面 书籍介绍:本书从前端开发人员的需求出发,以"流"为线索,从结构.内容到美化装饰等方面,全面且深入地讲解前端开发人员必须了解和掌握的大量的CSS知识点.同时,作者结合多年的 ...

  10. 开源交流丨批流一体数据集成工具ChunJun同步Hive事务表原理详解及实战分享

    原文链接:批流一体数据集成工具ChunJun同步Hive事务表原理详解及实战分享 课件获取:关注公众号__ "数栈研习社",后台私信 "ChengYing"__ ...