2012-05-09 40 views
85

我從互聯網上檢索JSON字符串;像大多數JSON,我已經看到它包含由下劃線分隔的長鍵。實質上,我的目標是將JSON反序列化爲java對象,但我不在java代碼中使用下劃線。傑克遜克服強調駱駝案件的下劃線

舉例來說,我可能會在駱駝情況下UserfirstName領域,同時我需要以某種方式告訴傑克遜從JSON first_name鍵映射到firstName類字段。可能嗎?

class User{ 
    protected String firstName; 
    protected String getFirstName(){return firstName;} 
} 

回答

59

你應該要更改默認名稱映射領域使用@JsonProperty

class User{ 
    @JsonProperty("first_name") 
    protected String firstName; 
    protected String getFirstName(){return firstName;} 
} 

欲瞭解更多信息:在API

+49

不要這樣做,否則你必須爲每個屬性都這樣做。請參閱下面的hpi迴應。 –

+0

我只能註釋一個屬性,但它確實改變了生成的字符串中的屬性順序:註釋的屬性最後出現。 (傑克遜2.3.0) – eebbesen

+1

@RyanShillington - 糾正我,如果我錯了,但這是你唯一的選擇,如果你正在解析的JSON字符串不使用一致的格式,即使用camelCase和下劃線? – DavidR

218

可以配置ObjectMapper駱駝情況下轉換爲名稱以下劃線

this.objectMapper.setPropertyNamingStrategy(
    PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); 
+5

請注意,這只是在傑克遜1.9中引入的。 –

+38

@deprecated自2。7改爲使用SNAKE_CASE; – Thermech

+0

one qq:當我使用snake_case命名策略時,帶有下劃線的json文件會被反序列化爲camel case? –

22

關於@JsonPropertyCAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES以上的答案是100%準確的,儘管有些人(像我)可能試圖在基於代碼的配置的Spring MVC應用程序中執行此操作。這裏的示例代碼(我有內部Beans.java),以達到預期的效果:如果你想這樣的一個類

@Bean 
public ObjectMapper jacksonObjectMapper() { 
    return new ObjectMapper().setPropertyNamingStrategy(
      PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); 
} 
+8

Spring Boot的替代方案,如果您使用的是Spring Boot <= 1.3,則在application.properties中添加'spring.jackson.property -naming-strategy = CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCOR ES'。對於Spring Boot 1.4,使用'spring.jackson.property-naming-strategy = SNAKE_CASE'來代替。 –

+1

@zapl是的,我說的可能是jackson的版本,而不是spring-boot的版本。讓我刪除該評論以避免混淆。 –

+1

從Jackson版本2.7開始,它是SNAKE_CASE。這工作對我來說:'最終的ObjectMapper對象映射=新的ObjectMapper()。setPropertyNamingStrategy( PropertyNamingStrategy.SNAKE_CASE);' – Jonathan

17

,您可以使用PropertyNamingStrategy@JsonNaming,像這樣:

@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) 
public static class Request { 

    String businessName; 
    String businessLegalName; 

} 

會序列化到:

{ 
    "business_name" : "", 
    "business_legal_name" : "" 
} 
34

如果彈簧啓動應用程序,在application.properties文件,只是使用

spring.jackson.property命名策略= SNAKE_CASE

或註釋與此標註模型類。

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

+0

如果我用「@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)」註釋我的類它的作品。但是,如果我在「application.properties」中使用「spring.jackson.property-naming-strategy = SNAKE_CASE」,它不會。我正在使用「Spring Boot(v2.0.0.BUILD-SNAPSHOT)」。你有什麼想法 ? – Bruno

4

春天的新版本,刪除此配置文件到您的項目(或只取豆)。我發現這適用於響應映射以及請求身體映射。

import com.fasterxml.jackson.databind.PropertyNamingStrategy; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; 

@Configuration 
public class JacksonConfiguration { 

    @Bean 
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() { 
     return new Jackson2ObjectMapperBuilder() 
       .propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); 
    } 

} 
+0

這不適合我。 – user216661

+0

你知道是否有另一個jackson2objectmapper實例被加載並覆蓋這個實例嗎?你可以確認,即使這個bean正在被加載? –

+0

也給DuffJ的解決方案一個旋風。它非常相似。 –