感觉jackson确实非常方便强大,但是在某些方面确实傻傻的,很萌。

实在没办法不用他,毕竟已经和spring mvc或jersey等框架高度整合了…

一、问题场景

如果json中有一个名为isAdmin的boolean类型的变量,jackson如何将其转化为实体类呢?

正常人都是这样转的,先写好一个实体类,有个属性是:

然后直接这样转:

感觉已经完成了是不是?

当然不可能了,结果是报错:

Unrecognized field “isAdmin” (class com.xie.pojo.user), not marked as ignorable

说明根本就找不到isAdmin这个属性!但是json里面确实是有这个属性的…..

为什么会这样呢?

二、尝试解决

首先有个这样的注释:

用来修饰实体类

现在报错是不报错了,toString一下,发现解析出来的实体类变成了:admin=false。

json那里明明是isAdmin,解析出来怎么变成admin了…

可以发现,jackson在转换isAdmin的boolean类型的属性时,会把is去掉将其转换成admin。

然后还有个这样的注解,

修饰实体类中的属性:

这样就解决了吗?事实上是又想多了…结果变成了:

  1. admin=false
  2. isAdmin=false

学会分身术,变成两个了…

也就是说,单一的这个@JsonProperty(“isAdmin”),并不能停止jackson蠢萌的行为…

最后需要的一个注解是:

用来修饰set方法:

奇迹发生了…这次终于正常了…

三、解决方法

解决方法为:

最后我发现,只要有@JsonProperty和@JsonIgnore注解就正常了,@JsonIgnoreProperties(ignoreUnknown = true)可以不加。

其实这里就涉及到数据库字段的命名了。我个人挺喜欢isAdmin这样的命名,感觉应该算规范。想不到会在jackson解析这一步上遇到坑,简直是莫名其妙。

四、总结

如果实体类中有类似的字段,就要小心了。实际上这个问题应该使用设计来规避:

某些字段完全可以去掉is,比如写成success,valid。

发表评论

电子邮件地址不会被公开。 必填项已用*标注