对 jackson 原理感兴趣的同学可以跟踪代码,读一下实现代码。
- 收集 bean 的属性名称 :
com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector#collectAll() 方法中对 bean 的 field、get 方法、set 方法进行了收集。jackson 会忽略所有 private 字段、方法。最终收集到的 field 、get/set 方法名作为了 属性名称集合 。反序列化的时候,如果 json 中的属性名在属性名称集合中找不到的话,就没法设置值了。 - 把大写名称改为小写的具体实现方法 :
在 com.fasterxml.jackson.databind.util.BeanUtil#legacyManglePropertyName() 方法中把大写名称改为了小写。
* Method called to figure out name of the property, given
* corresponding suggested name based on a method or field name.
* @param basename Name of accessor/mutator method, not including prefix
* ("get"/"is"/"set")
protected static String legacyManglePropertyName(final String basename, final int offset)
final int end = basename.length();
if (end == offset) {
return null;
char c = basename.charAt(offset);
char d = Character.toLowerCase(c);
if (c == d) {
return basename.substring(offset);
StringBuilder sb = new StringBuilder(end - offset);
sb.append(d);
int i = offset+1;
for (; i < end; ++i) {
c = basename.charAt(i);
d = Character.toLowerCase(c);
if (c == d) {
sb.append(basename, i, end);
break;
sb.append(d);
return sb.toString();
下面两种方法任意一种都可以解决大小写不匹配的问题 :
- 在 BH 字段上加注解 @JsonProperty(“BH”) 来显式的声音属性的名称是 BH 。
- 在 getBH() 方法或者 setBH() 这两个方法中的任意一个方法上加 @JsonProperty(“BH”) 注解。
面对不遵守驼峰命名规则的接口,比如属行首字母用大写,这样导致使用Jackson解析出来的对象的属性均为空,经过跟踪源码发现,是由于其根据getters方法解析的属性,属性字母都变为了小写,这就导致无法解析了出现了jackson Unrecognized field 的问题。
@Data
public class JobType {
private int jobType;
默认情况下类的成员变量以小写字母开头, 当需要以大写开头时,系统在编译时或者swagger在传递参数时都会自动将大写变为小写,带来一些不便, 寻找后采取以下解决办法:
1. 解决swagger传递时的大写问题
@JsonProperty //这个注解帮助实现大写传递
private String L1; //country;
@JsonProperty
priv...
springboot使用默认的jackson在序列化实体为json字符串时的问题,
属性名只有大小写差异时,后面的会被忽略
public static void main(String[] args) throws JsonProcessingException {
TestVO testVO = new TestVO();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.
官方WIKI:https://github.com/FasterXML/jackson-databind/wiki
jackson 1.x和2.x版本的注解是放置在不同的包下的
1.x是在jackson core jar包org.codehaus.jackson.annotate下
2.x是在jackson-databind包com.fasterxml.jackson.annot