我在 Spring 使用Jackson来将我的类序列化为JSON。当我像下面的示例那样序列化一个类时,Jackson会将某些字段的名称从Camel Case更改为小写。我知道我可以通过创建自定义(反)序列化器来解决此问题,但我希望在全局范围内将其关闭。也许通过在application.properties中设置一个属性。
按照default Jackson naming strategy,这不应该发生:

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);
}
预期:
{“firstName”:“first”,“name”:“名称”,“abName”:“ab”,“ aName ”:“a”}
实际:
{“firstName”:“first”,“name”:“名称”,“abName”:“ab”,“ aname ”:“a”}
编辑:
将问题缩小到解释 setter/getter 。开始看起来像 jackson 中的错误。
class Foo {
    private final String aName;

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

    public String getaName() {
        return this.aName;
    }
}
序列化为{"aName":"a"}然而,
class Foo {
    private final String aName;

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

    public String getAName() {
        return this.aName;
    }
}
序列化为{"aname":"a"}

最佳答案

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



而且您有一个带有aName field的小巧包。因为如果 setter/getter 看起来像AName(),那么当您从该 setter/getter 转换回去时,您应该根据规范查找AName字段。这是其他信息explanation

因此,要解决此问题,您可以在field/getter上方使用适当的getter(getaName())或@JsonProperty("aName")批注

这是similar question

10-07 21:19