fastjson 笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_37933685/article/details/102932452

demo代码地址

demo/fastjson at master · suveng/demo · GitHub

fastjson 最佳实践

如果有更好的可以联系作者修正,哈哈哈哈

Maven 下引入 Fastjson

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

序列化一个对象成 JSON 字符串

demo.java

	/**
	 * 序列化一个对象成JSON字符串
	 * @author suwenguang
	 * @date 2019/11/6
	 */
	public String ObjToJsonString(){
		Human human = new Human();
		human.setBody("good");
		human.setSpirit("上天");
		human.setBirthday(new Date());
		human.setAge(22L);
		ArrayList<Human> famaily = new ArrayList<>();
		for (int i = 0; i < 5; i++) {
			Human member = new Human();
			member.setBody("good");
			member.setSpirit("上天");
			member.setBirthday(new Date());
			member.setAge(22L);
			famaily.add(member);
		}
		human.setFamaily(famaily);
		return JSON.toJSONString(human);
	}

hunman.java

@Data
public class Human {

	/**
	 * 身体
	 */
	private String body;

	/**
	 * 精神
	 */
	private  String spirit;

	/**
	 * 出生日期
	 */
	private Date birthday;

	/**
	 * 年龄
	 */
	private Long age;

	/**
	 * 家庭
	 */
	private List<Human> famaily;
}

结果

{
    "age": 22,
    "birthday": 1573007531738,
    "body": "good",
    "famaily": [
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        },
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        },
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        },
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        },
        {
            "age": 22,
            "birthday": 1573007531738,
            "body": "good",
            "spirit": "上天"
        }
    ],
    "spirit": "上天"
}

反序列化一个 JSON 字符串成 Java 对象

demo.java 使用刚刚的序列化字符串做 反序列化

   /**
	 * 反序列化字符串到java对象
	 * @author suwenguang
	 * @date 2019/11/6
	 */
	public Human stringToObject(){
		String json = "{\n" +
			"    \"age\": 22,\n" +
			"    \"birthday\": 1573007531738,\n" +
			"    \"body\": \"good\",\n" +
			"    \"famaily\": [\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        },\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        },\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        },\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        },\n" +
			"        {\n" +
			"            \"age\": 22,\n" +
			"            \"birthday\": 1573007531738,\n" +
			"            \"body\": \"good\",\n" +
			"            \"spirit\": \"上天\"\n" +
			"        }\n" +
			"    ],\n" +
			"    \"spirit\": \"上天\"\n" +
			"}";
		return JSON.parseObject(json, Human.class);
	}

结果

日期格式处理

  1. 特殊字段处理 @JsonField
  2. 全局处理 FastJsonConfig

特殊字段配置

字段注解配置

	/**
	 * 出生日期
	 */
	@JSONField(format = "yyyy-MM")
	private Date birthday;

结果

{
    "age": 22,
    "birthday": "2019-11",
    "body": "good",
    "famaily": [
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },
        { "age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" }
    ],
    "spirit": "上天"
}

全局配置

使用 JsonField 配置日期格式,被 FastJsonConfig 的全局配置覆盖掉 · Issue #1868 · alibaba/fastjson · GitHub

SerializerFeature 属性使用

SerializerFeature 属性使用

使用

  1. 手动使用
  2. 全局配置

JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

属性解释

名称

含义

QuoteFieldNames

输出 key 时是否使用双引号,默认为 true

SkipTransientField

如果是 true,类中的 Get 方法对应的 Field 是 transient,序列化时将会被忽略。默认为 true

UseSingleQuotes

使用单引号而不是双引号,默认为 false

WriteMapNullValue

是否输出值为 null 的字段,默认为 false

WriteEnumUsingToString

Enum 输出 name()或者 original,默认为 false

UseISO8601DateFormat

Date 使用 ISO8601 格式输出,默认为 false

WriteNullListAsEmpty

List 字段如果为 null,输出为[],而非 null

WriteNullStringAsEmpty

字符类型字段如果为 null,输出为”“,而非 null

WriteNullNumberAsZero

数值字段如果为 null,输出为 0,而非 null

WriteNullBooleanAsFalse

Boolean 字段如果为 null,输出为 false,而非 null

SortField

按字段名称排序后输出。默认为 false

WriteTabAsSpecial

把\t 做转义输出,默认为 false

PrettyFormat

结果是否格式化,默认为 false

WriteClassName

序列化时写入类型信息,默认为 false。反序列化是需用到

DisableCircularReferenceDetect

消除对同一对象循环引用的问题,默认为 false

WriteSlashAsSpecial

对斜杠’/’进行转义

BrowserCompatible

将中文都会序列化为\uXXXX 格式,字节数会多一些,但是能兼容 IE 6,默认为 false

WriteDateUseDateFormat

全局修改日期格式,默认为 false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

DisableCheckSpecialChar

一个对象的字符串属性中如果有特殊字符如双引号,将会在转成 json 时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为 false

BeanToArray

将对象转为 array 输出

属性过滤器

SerializeFilter 是通过编程扩展的方式定制序列化。Fastjson 支持 6 种 SerializeFilter,用于不同场景的定制序列化。

  • PropertyPreFilter:根据 PropertyName 判断是否序列化
  • PropertyFilter:根据 PropertyName 和 PropertyValue 来判断是否序列化
  • NameFilter:修改 Key,如果需要修改 Key,process 返回值则可
  • ValueFilter:修改 Value
  • BeforeFilter:序列化时在最前添加内容
  • AfterFilter:序列化时在最后添加内容

自定义序列化与反序列化

自定义序列化

  1. 实现 ObjectSerializer
  2. 注册 ObjectSerializer

自定义反序列化

  1. 自定义实现 ObjectDeserializer
  2. 注册并使用 ObjectDeserializer

JSON 最佳实践 | kimmking’s blog

解决 FastJson 中“$ref 循环引用”的问题

解决 FastJson 中“$ref 循环引用”的问题

解决: 关闭循环依赖检测 DisableCircularReferenceDetect

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GA小站

2.5.4、Google Analytics高级应用——API的使用

GA非常强大,但是免费版的有诸多的限制,如:GA里面最多能导出的记录是5000,如果要做细致,个性化的分析,无疑是需要用到API,免费版GA通过API最多可以拿...

6020
来自专栏大数据成神之路

Druid SQL和Security在美团点评的实践

场景描述:虽长久以来,对SQL和权限的支持一直是Druid的软肋。虽然社区早在0.9和0.12版本就分别添加了对SQL和Security的支持,但根据我们了解,...

12920
来自专栏GA小站

3.2.1、Google Tag Manager实战指南—— 容器的导出与导入

在GTM中,可以将现有的配置导出,然后再导入到其他的容器中,利用这个可以导入别人的配置,看别人的怎么使用GTM或复制同样的配置到其他站点,导入和导出的方法非常简...

6210
来自专栏只喝牛奶的杀手

HttpMessageConverter的作用

在SpringMVC或者SpringBoot的使用时,定义接口往往会用到RequestParam和RequestBody及ResponseBody这三个注解,R...

10410
来自专栏杨建荣的学习笔记

MySQL数据流转集成,从快速测试Maxwell开始

在Binlog解析方向和数据流转方向上,经常会提到比较有名的几类工具,阿里的Canal,Zendesk的Maxwell和Yelp的mysql_streame...

8210
来自专栏机器学习AI算法工程

对美食评语进行情感分析

Yelp Reviews是Yelp为了学习目的而发布的一个开源数据集。它包含了由数百万用户评论,商业属性和来自多个大都市地区的超过20万张照片。这是一个常用的全...

11520
来自专栏中科院渣渣博肆僧一枚

notepad++

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

21010
来自专栏机器学习AI算法工程

大规模中文自然语言处理语料(百科,问答、新闻,翻译)

中文的信息无处不在,但如果想要获得大量的中文语料,却是不太容易,有时甚至非常困难。在2019年初这个时点上,普通的从业者、研究人员或学生,并没有一个比较好的渠道...

11410
来自专栏程序手艺人

C++之rapidjson构造Json数据集合

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

12820
来自专栏机器学习AI算法工程

darknet图像定位+tornado实现票据识别API,3w张发票识别率达到95以上

11820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励