fastjson的使用和理解

常见方法

toJSONString

用于序列化对象。
相关方法
可以看到有很多重载方法,我们看几个有代表性的方法

toJSONString()

序列化的基础方法,等同于这个类的toString()方法

@Override
public String toString() {
    return toJSONString();
}
public String toJSONString() {
    SerializeWriter out = new SerializeWriter();
    try {
        new JSONSerializer(out).write(this);
        return out.toString();
    } finally {
        out.close();
    }
}
toJSONString(Object object, boolean prettyFormat)

源码如下,主要还是看String toJSONString(Object object, SerializerFeature... features)这个方法

public static String toJSONString(Object object, boolean prettyFormat) {
    if (!prettyFormat) {
        return toJSONString(object);
    }
    return toJSONString(object, SerializerFeature.PrettyFormat);
}
toJSONString(Object object, int defaultFeatures, SerializerFeature… features)
public static String toJSONString(Object object, int defaultFeatures, SerializerFeature... features) {
    SerializeWriter out = new SerializeWriter((Writer) null, defaultFeatures, features);
     try {
         JSONSerializer serializer = new JSONSerializer(out);
         serializer.write(object);
         return out.toString();
     } finally {
         out.close();
     }
 }

其中defaultFeatures是默认生成特性的意思

com.alibaba.fastjson.JSON类中有两个特性配置一个是序列化对象的特性(com.alibaba.fastjson.serializer.SerializerFeature),一个是反序列化的特性(com.alibaba.fastjson.parser.Feature)

SerializerFeature特性:

名称含义
QuoteFieldNames文本
UseSingleQuotes文本
WriteMapNullValue文本
WriteEnumUsingToString文本
WriteEnumUsingName文本
UseISO8601DateFormat文本
WriteNullListAsEmpty文本
WriteNullStringAsEmpty文本
WriteNullNumberAsZero文本
WriteNullBooleanAsFalse文本
SkipTransientField文本
SortField文本
WriteTabAsSpecial文本
PrettyFormat文本
WriteClassName文本
DisableCircularReferenceDetect文本
WriteSlashAsSpecial文本
WriteSlashAsSpecial文本
WriteSlashAsSpecial文本
WriteSlashAsSpecial文本
WriteSlashAsSpecial文本
WriteSlashAsSpecial文本

parseObject

用于将json字符串转换为对象的方法

public static <T> T parseObject(String text, Class<T> clazz) {
 return parseObject(text, clazz);
}

不常见的类

com.alibaba.fastjson.TypeReference

用于parseObject转泛型对象时,因为目前java没有提供表示泛型的方法,所以fastjson定义了这个类

隐患问题

TODO
http://www.javashuo.com/article/p-mmakhqfd-dz.html

异常

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2022-06-21 00:00:00": not a valid representation (error: Failed to parse Date value '2022-06-21 00:00:00': Cannot parse date "2022-06-21 00:00:00": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))

使用【JSON.parseArray】反序列化yyyy-MM-dd HH:mm:ss格式日期失败

解决方案

在你反序列化的java对象中Date类型的属性加上注解 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

扩展知识

yyyy-MM-dd’T’HH:mm:ss.SSS Z这种格式是ISO8601的规定的时间格式
其中T表示日期跟时间的分隔
SSS表示毫秒数
Z表示0时区
如果我们通过swagger构造入参时间属性时,可以通过浏览器控制台new Date().getTime(),这个将会返回一个时间戳(从1970年1月1日到现在的毫秒数),我们可以直接把这个数字作为时间属性,后端会将其转为对应的日期对象,比构造那么一个复杂格式的字符串要快速很多

JSON.toJSONString(xx),日期对象转为时间戳格式,希望转为 yyyy-MM-dd HH:mm:ss 格式

解决方案

使用SerializerFeature.WriteDateUseDateFormat
对应调用方式改为JSON.toJSONString(xxx, SerializerFeature.WriteDateUseDateFormat)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值