前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >fastjson 笔记

fastjson 笔记

作者头像
suveng
发布2019-11-12 23:21:33
1.5K0
发布2019-11-12 23:21:33
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。undefined本文链接:https://blog.csdn.net/qq_37933685/article/details/102932452

demo代码地址

demo/fastjson at master · suveng/demo · GitHub

fastjson 最佳实践

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

Maven 下引入 Fastjson

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.32</version>
</dependency>

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

demo.java

代码语言:javascript
复制
	/**
	 * 序列化一个对象成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

代码语言:javascript
复制
@Data
public class Human {

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

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

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

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

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

结果

代码语言:javascript
复制
{
    "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 使用刚刚的序列化字符串做 反序列化

代码语言:javascript
复制
   /**
	 * 反序列化字符串到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
特殊字段配置

字段注解配置

代码语言:javascript
复制
	/**
	 * 出生日期
	 */
	@JSONField(format = "yyyy-MM")
	private Date birthday;

结果

代码语言:javascript
复制
{
    "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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • demo代码地址
  • fastjson 最佳实践
    • Maven 下引入 Fastjson
      • 序列化一个对象成 JSON 字符串
        • 反序列化一个 JSON 字符串成 Java 对象
          • 日期格式处理
            • 特殊字段配置
            • 全局配置
        • SerializerFeature 属性使用
          • 使用
            • 属性解释
            • 属性过滤器
            • 自定义序列化与反序列化
              • 自定义序列化
                • 自定义反序列化
                • 解决 FastJson 中“$ref 循环引用”的问题
                相关产品与服务
                文件存储
                文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档