fastjson 笔记

fastjson 笔记

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
WriteEnumUsingToStringEnum 输出 name()或者 original,默认为 false
UseISO8601DateFormatDate 使用 ISO8601 格式输出,默认为 false
WriteNullListAsEmptyList 字段如果为 null,输出为[],而非 null
WriteNullStringAsEmpty字符类型字段如果为 null,输出为”“,而非 null
WriteNullNumberAsZero数值字段如果为 null,输出为 0,而非 null
WriteNullBooleanAsFalseBoolean 字段如果为 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值