낙타 사건에 찬성하여 밑줄을 극복하는 잭슨


160

인터넷에서 JSON 문자열을 검색합니다. 내가 본 대부분의 JSON과 마찬가지로 밑줄로 구분 된 긴 키가 포함되어 있습니다. 본질적으로 내 목표는 JSON을 java 객체로 deserialize하는 것이지만 Java 코드에는 밑줄을 사용하지 않습니다.

예를 들어 낙타의 경우 필드 가있는 User클래스가 있을 수 있으며 firstName동시에 잭슨에게 first_nameJSON에서 firstName클래스 필드로 키 를 매핑하도록 지시해야 합니다. 가능합니까?

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

답변:


103

@JsonProperty기본 이름 매핑을 변경하려는 필드에서를 사용해야합니다 .

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

자세한 정보 : API


86
이 작업을 수행하지 않으면 모든 속성에 대해 수행해야합니다. 아래 thehpi의 답변을 참조하십시오.
Ryan Shillington

하나의 속성에만 주석을 달 수 있었지만 생성 된 문자열의 속성 순서가 변경되었습니다. 주석이 달린 속성이 마지막에 표시되었습니다. (Jackson 2.3.0)
eebbesen

1
@RyanShillington-내가 틀렸다면 수정하지만 파싱하는 JSON 문자열이 일관된 형식을 사용하지 않는 경우, 즉 camelCase와 밑줄을 모두 사용하는 경우 이것이 유일한 옵션입니까?
DavidR

@DavidR 맞습니다. 소스 데이터를 수정할 수 없다고 가정합니까? 짜증나
Ryan Shillington

@PaulTsai 좋아, 그래서 자유롭게 사용하십시오 :)
Alex

351

ObjectMapper낙타 문자를 밑줄을 사용하여 이름으로 변환 하도록 구성 할 수 있습니다 .

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

또는 다음 주석으로 특정 모델 클래스에 주석을 답니다.

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

Jackson 2.7 이전에는 상수 이름이 다음과 같이 지정되었습니다.

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

5
이것은 Jackson 1.9에서만 소개되었습니다.
David Moles

62
@deprecated 2.7 이후 SNAKE_CASE를 대신 사용하십시오.
Thermech

1
한 QQ : snake_case 이름 지정 전략을 사용하면 밑줄이있는 json 파일이 낙타 케이스에 직렬화 해제됩니까?
Ram Patra

2
예 @Ramswaroop이 잭슨 말하는 모두 제작 및 snake_case 기대하는
드류 스티븐스

1
@Ramswaroop Jackson 2.7.3 및 저에게 @JsonProperty(일반 camelCaseJava 속성 에서 유추 된 이름으로) 주석이 달린 속성 PropertyNamingStrategy.SNAKE_CASE은 직렬화가 낙타 케이스 JSON (사용했던대로)에서 작동을 멈추고 snake_case가 필요합니다.
Drew Stephens

119

스프링 부트 응용 프로그램 인 경우 application.properties 파일에서

spring.jackson.property-naming-strategy = SNAKE_CASE

또는이 주석으로 모델 클래스에 주석을 답니다.

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)


3
"@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)"로 수업에 주석을 달면 작동합니다. 그러나 "application.properties"에서 "spring.jackson.property-naming-strategy = SNAKE_CASE"를 사용하면 그렇지 않습니다. "Spring Boot (v2.0.0.BUILD-SNAPSHOT)"를 사용하고 있습니다. 당신은 어떤 아이디어가 있습니까?
Bruno

1
여기에서도 동일하게 spring.jackson.property-naming-strategy=SNAKE_CASE작동하지 않습니다. 스프링 부트 2.0을 사용하고 있습니다.
soulmachine

1
spring.jackson.property-naming-strategy = SNAKE_CASE가 작동하지 않습니다. 스프링 부트 2.0.5를 사용하고 있습니다. 그러나 주석을 사용하는 것은 저에게
Neo Pham

아마 당신 ObjectMapper은 Spring에 의해 만들어지지 않았습니까? ObjectMapper를 리턴하는 @Bean 메소드로 @Configuration 클래스를 작성하십시오. 이것이 필요한지 확실하지 않습니다.
Ondra Žižka 2016 년

48

단일 클래스에 대해 이것을 원한다면 다음 과 같이 @JsonNaming 과 함께 PropertyNamingStrategy 를 사용할 수 있습니다 .

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

    String businessName;
    String businessLegalName;

}

다음으로 직렬화됩니다.

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

이후 에 찬성되지 않는 사용한다, 그래서 :Jackson 2.7LowerCaseWithUnderscoresStrategySnakeCaseStrategy

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

    String businessName;
    String businessLegalName;

}

29

에 대한 위의 답변 @JsonProperty과는 CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES(나 같은) 어떤 사람들은 코드 기반의 구성으로 스프링 MVC 응용 프로그램 내에서이 작업을 수행하려고 할 수도 있지만, 100 % 정확합니다. Beans.java원하는 효과를 얻는 샘플 코드 (내가 가지고있는 ) 는 다음과 같습니다 .

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

9
Spring Boot <= 1.3을 사용하는 경우 application.propertiesadd 에서 Spring Boot의 대안 spring.jackson.property-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCOR‌​ES. Spring Boot 1.4의 경우 spring.jackson.property-naming-strategy=SNAKE_CASE대신 사용하십시오.
Dump Cake

1
@ zapl 네, 맞습니다. 아마 스프링 스프링 버전 대신 잭슨 버전을 언급했을 것입니다. 혼동을 피하기 위해 해당 주석을 삭제하겠습니다.
Ram Patra

1
Jackson 버전 2.7부터는 SNAKE_CASE입니다. 이것은 나를 위해 일했다 : final ObjectMapper objectMapper = new ObjectMapper().setPropertyNamingStrategy( PropertyNamingStrategy.SNAKE_CASE);
Jonathan

12

현재 모범 사례는 application.yml(또는properties ) 파일 입니다.

예:

spring:
  jackson:
    property-naming-strategy: SNAKE_CASE

보다 복잡한 구성 요구 사항이있는 경우 프로그래밍 방식으로 Jackson을 구성 할 수도 있습니다.

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);
        // insert other configurations
    }

} 

jackson2objectmapper의 다른 인스턴스가로드되어 있고이 인스턴스를 대체하는지 알고 있습니까? 이 Bean도로드 중임을 확인할 수 있습니까?
Kenny Cason

또한 DuffJ의 솔루션에 소용돌이를주십시오. 꽤 비슷합니다.
Kenny Cason

속성을 조정하는 것이 올바른 방법이라고 생각합니다. 또한 권장합니다. 이것도 마찬가지입니다.
WesternGun

@WesternGun 좋은 전화. 가능한 경우 yaml / properties를 통해이 작업을 수행하는 경향이 있습니다.
Kenny Cason

6

아래 두 가지 버전의 Jackson 라이브러리에 대한 두 가지 전략을 나타내는 답변이 거의 없습니다.

잭슨 2.6. *

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

Jackson 2.7의 경우 *

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.SNAKE_CASE);

다시 그들은 일부 값을 더 이상 사용하지 않습니다. 이제 KEBAB_CASE, yum!
Kalpesh Soni

FTR : 케밥 케이스는 snake_case가 아닙니다 ;-)
René
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.