2017-10-09 70 views
1

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

default Jackson naming strategy,这是不应该发生的:

在没有注册的自定义策略,默认的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); 
} 

预计:

{ “名字”: “第一”, “名”:“南E “ ”abName“: ”AB“,” aName “:” 一个 “}

实际:

{” 名字 “:” 第一”, “名称”: “姓名”, “abName”: “AB”, “aname ”:“ 一”}

编辑:

缩小问题下到干将解释。开始在杰克逊看起来像一个bug。

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"}

+0

使用'@JsonProperty( “AName”)'你就完成了 – Optional

回答

4

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

但是支持偶尔使用全大写的名字,我们 检查,如果前两个字符的名称都是大写和 如果是离开它单独

“fooBah”变成“fooBah”

“Z”变为“Z”

“URL”变成“URL”

而且您有一个aName字段的边缘案例。因为如果吸气剂看起来像AName(),那么当你从这个吸气剂转回来时,你应该根据规范寻找AName字段。这是额外的信息explanation

因此,要解决这个问题,你可以使用适当的吸气剂(getaName())或@JsonProperty("aName")注释以上场/吸气

这里是similar question

2

虽然我不知道为什么杰克逊读取getANameaname,有可能迫使杰克逊与@JsonProperty("AName")使用某个名称。例如:(得到了this密切相关的问题,这种解决方案)

class Foo { 
    private final String aName; 

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

    @JsonProperty("AName") 
    public String getAName() { 
     return this.aName; 
    } 
}