阻止杰克逊改变变量名称的案例

Ant*_*nyW 8 java jackson spring-boot

我在Spring中使用Jackson将我的类序列化为JSON.当我像下面的例子一样序列化一个类时,Jackson正在将某些字段的名称从Camel Case更改为小写.我知道我可以通过创建自定义(de)序列化器来解决这个问题,但我希望能够全局关闭它.也许通过在application.properties中设置属性.

根据默认的Jackson命名策略,这不应该发生:

如果没有注册的自定义策略,则使用默认的Java属性命名策略,它将字段名称保留为......

class Foo {
    private final String firstName;
    private final String aName;
    private final String name;
    private final String abName;

    Foo(final String firstName, final String aName, final String name, final String abName) {
        this.firstName = firstName;
        this.aName = aName;
        this.name = name;
        this.abName = abName;
    }
    // Getters here
}

public static void main(String[] args) {
        final ObjectMapper mapper = new ObjectMapper();
        final Foo foo  = new Foo("first", "a", "name", "ab");
        final String jsonInString = mapper.writeValueAsString(foo);
        System.out.println(jsonInString);
}
Run Code Online (Sandbox Code Playgroud)

预期:

{"firstName":"first","name":"name","abName":"ab"," aName ":"a"}

实际:

{"firstName":"first","name":"name","abName":"ab"," aname ":"a"}

编辑:

将问题缩小到解释吸气剂.开始看起来像杰克逊的一个错误.

class Foo {
    private final String aName;

    Foo(final String aName) {
        this.aName = aName;
    }

    public String getaName() {
        return this.aName;
    }
}
Run Code Online (Sandbox Code Playgroud)

序列化为 {"aName":"a"}

然而,

class Foo {
    private final String aName;

    Foo(final String aName) {
        this.aName = aName;
    }

    public String getAName() {
        return this.aName;
    }
}
Run Code Online (Sandbox Code Playgroud)

序列化为 {"aname":"a"}

var*_*ren 11

这里的问题更多是关于JavaBeans(TM)规范.根据规格(第58页)

但是为了支持偶尔使用所有大写字母名称,我们检查名称的前两个字符是否都是大写字母,如果是这样的话,请不要管它

"FooBah"成为"fooBah"

"Z"变为"z"

"网址"变为"网址"

而且你有一个带有aName字段的边缘情况.因为如果getter看起来像AName(),那么当你从这个getter转换回来时,你应该根据规范查找AName字段.这是其他信息说明

因此,要解决此问题,您可以在字段/ getter上方使用正确的getter(getaName())或@JsonProperty("aName")注释

这是类似的问题


小智 5

虽然我不确定杰克逊为什么读到getANameaname但可以强迫杰克逊使用某个带有 的名字@JsonProperty("AName")。例如:

class Foo {
    private final String aName;

    Foo(final String aName) {
        this.aName = aName;
    }

    @JsonProperty("AName")
    public String getAName() {
        return this.aName;
    }
}
Run Code Online (Sandbox Code Playgroud)

(从这个密切相关的问题中得到了这个解决方案。)