常见方法
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)