fastjson2反序列化时,不能识别特殊格式的时间字符串(但是fastjson1可以)
环境信息
OS信息: win10 JDK信息: jdk8 版本信息:Fastjson2 2.0.17
重现步骤
运行下述代码即可
import com.alibaba.fastjson2.JSON; import lombok.Data;
import java.io.Serializable; import java.time.LocalDateTime;
public class DemoApplication {
public static void main(String[] args) {
String str = "{\"callTime\": \"2022-12-02T03:33:52.000+0000\"}";
BizDTO bizDTO = JSON.parseObject(str, BizDTO.class);
System.err.println("calltime=" + bizDTO.getCalltime());
}
@Data
public static class BizDTO implements Serializable {
private LocalDateTime calltime;
}
}
期待的正确结果
fastjson2反序列化时能识别该格式的时间(注:fastjson1反序列化时能识别该时间的)
相关日志输出
实际fastjson2不能识别该时间,输出为null
calltime=null
原提问者GitHub用户JustryDeng
这个是字段大小写不匹配的问题,加上上面这个就可以了
BizDTO bizDTO = JSON.parseObject(str, BizDTO.class, JSONReader.Feature.SupportSmartMatch);
原回答者GitHub用户wenshao
在fastjson2中,时间字符串的格式默认为ISO-8601格式,例如:"yyyy-MM-dd'T'HH:mm:ss.SSSXXX",如果需要识别其他格式的时间字符串,需要使用自定义反序列化器(Deserializer)。
以下是一个示例代码,演示如何使用自定义反序列化器来识别时间字符串:
import java.lang.reflect.Type; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.JSONToken; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
public class DateDeserializer implements ObjectDeserializer { private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Date deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
String dateString = parser.parseObject(String.class); // 读取时间字符串
try {
return dateFormat.parse(dateString);
} catch (ParseException e) {
throw new RuntimeException("parse date error", e);
}
}
@Override
public int getFastMatchToken() {
return JSONToken.LITERAL_STRING;
}
}
public class Test { public static void main(String[] args) { String json = "{"time":"2021/9/27 11:11:11"}"; JSON.DEFAULT_PARSER.getConfig().putDeserializer(Date.class, new DateDeserializer()); // 注册自定义反序列化器 Data data = JSON.parseObject(json, Data.class); System.out.println(data.getTime()); // 输出时间值 } }
class Data { private Date time;
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
} 在上述代码中,我们定义了一个自定义反序列化器DateDeserializer,它会读取字符串类型的时间值,并将其解析为Date类型。然后,我们将这个反序列化器注册到fastjson的解析器配置中,以便在反序列化时自动调用。
最后,我们使用示例数据{"time":"2021/9/27 11:11:11"}来进行反序列化,并输出时间值。在这个示例中,我们将时间字符串的格式设为"yyyy-MM-dd HH:mm:ss",因此在反序列化时需要使用SimpleDateFormat进行解析。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。