jsonformat(jsonformat注解 timezone)
@JsonFormat 可以作用于timeStamp吗?还是只可以转换Date为String
if rv is not None and rsv is not None:
# extract version/subversion
self._nmap_version_number = int(line[rv.start():rv.end()])
self._nmap_subversion_number = int(line[rsv.start()+1:rsv.end()])
break
}

Spring Boot使用@JsonProperty,@JsonIgnore,@JsonFormat注解
@JsonProperty, @JsonIgnore 和 @JsonFormat 注解都是 fasterxml jackson 里面的注解,现在也被 Spring Boot 集成了。
这里需要注意的是将对象转换成json字符串使用的方法是fasterxml.jackson提供的!!
如果使用fastjson
dependency
groupIdcom.alibaba/groupId
artifactIdfastjson/artifactId
version1.2.28/version
/dependency
没有生效,为啥?
因为fastjson不认识@JsonProperty注解呀!所以要使用jackson自己的序列化工具方法
我们在使用上面的注解时,不需要在 pom.xml 显示的引入 fasterxml jackson 的依赖包。只需要加入如下依赖即可。
@JsonProperty
用于属性、setter / getter 方法上,属性序列化后可重命名
生成的 json 字符串就是image_width和image_height。
@JsonIgnore
属性使用此注解后,将不被序列化。
@JsonFormat
用于格式化日期
@JsonInclude,@JsonIgnoreProperties,@JsonIgnore
真实案例
{
"rowid": "111111",
"created": "2018-12-27 16:15:25",
"createdby": "1111111",
"lastupd": "2018-12-27 08:25:48",
"lastupdby": "111111",
"modificationnum": 1
}
返回Json参数字段均为小写,在接收时,需要按照标准的命名规则进行映射
解决办法:
创建接收数据对象,生成Get\Set方法:,在Set方法上,加上@JsonProperty注解,
@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把rowId属性序列化为rowid,@JsonProperty("rowid")。
springmvc中jsonformat入参数不管用
项目中某一个接口使用@RequestBody将传入的Json字符串参数解析注入进封装的参数对象中,但是前台发送请求后却总是报错,一直提示json解析失败,但是在swagger中测试该接口却成功,于是开始了JSON参数的对比,并一点一点猜想并排除:是否String值的类型没有用双引号、是否布尔值需要双引号、是否字符编码不一样,最后在格式化工具的帮助下发现了问题。
前后端时间格式
前端传毫秒
1、不加@JsonFormat
前端:1517191582000(毫秒)
后台:private Date trialTime;
列表返回的时间格式:毫秒
2、加@JsonFormat
① @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
前端:1517191582000(毫秒)
后台:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date trialTime;
列表返回的时间格式:yyyy-MM-dd HH:mm:ss
② @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
前端:1517191582000(毫秒)
后台:
@JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
private Date trialTime;
列表返回的时间格式:yyyy-MM-dd
前端传"2018-01-03T02:01:13.678Z"
1、不加@JsonFormat
前端:"2018-01-03T02:01:13.678Z"
后台:private Date trialTime;
列表返回的时间格式:毫秒
2、加@JsonFormat
① 不支持"yyyy-MM-dd HH:mm:ss"这种格式
② 支持"yyyy-MM-dd"这种格式
前端:"2018-01-03T02:01:13.678Z"
后台:
@JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
private Date trialTime;
列表返回的时间格式:yyyy-MM-dd
前端传"yyyy-MM-dd HH:mm:ss"
1、不加@JsonFormat报错
2、加@JsonFormat
① 支持"yyyy-MM-dd HH:mm:ss"这种格式
前端:"yyyy-MM-dd HH:mm:ss"
后台:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date trialTime;
列表返回的时间格式:yyyy-MM-dd HH:mm:ss
② 不支持"yyyy-MM-dd"这种格式,因为前端传的时间格式已经限定死了
前端传"yyyy-MM-dd"
1、不加@JsonFormat (注:get请求,但是是用@RequestParam Map formData接收的,所以不影响。见贵安项目ArticleListControl中articleInfo接口)
前端:"yyyy-MM-dd"
后台:private Date trialTime;
列表返回的时间格式:毫秒
2、加@JsonFormat
① 不支持"yyyy-MM-dd HH:mm:ss"这种格式
② 支持"yyyy-MM-dd"这种格式
前端:"yyyy-MM-dd"
后台:
@JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
private Date trialTime;
列表返回的时间格式:yyyy-MM-dd
总结
Jackson不支持这种时间格式的:yyyy-MM-dd HH:mm:ss,试了一下,果然报错来了
Can not construct instance of java.util.Date from String value '2015-12-22 10:10:10': not a valid representation (error: Failed to parse Date value '2015-12-22 10:10:10': Can not parse date "2015-12-22 10:10:10": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))
看提示好像只支持这几种:
"yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"
主要看前端到→后台是否需要序列化
get请求时
① 后台用 @ModelAttribute T model 方式接收前端数据,会把传进来的参数序列化成对象T,前端传的参数有一个是String类型的 2018-12-25 时间,但是对象T中是date类型,所以如果不做转换的话会报400错误,在对象T的对应参数上加 @DateTimeFormat(pattern = "yyyy-MM-dd") 。通过@DateTimeFormat这个日期格式化注解,就可以将前端传入的字符串格式化为日期类型可以识别的内容信息了。当然也可以使用@DateTimeFormat(iso=ISO.DATE)这样子的格式化来进行处理,效果是一样的。JsonFormat适用于json方式?
② 如果后台用 @RequestParam Map formData 接收前端参数的话,即使前端传的时间是 yyyy-MM-dd 方式也不会报错,因为Map可以接收任意类型的参数
post请求时
因为post请求是用 @RequestBody
@JsonFormat与@DateTimeFormat注解的使用