library databind convert java jackson

java - databind - Jackson supera los guiones bajos a favor del camel-case



java jackson annotations (7)

Recupero una cadena JSON de internet; como la mayoría de JSON que he visto, incluye teclas largas que están separadas por guiones bajos. Básicamente, mi objetivo es deserializar JSON en objetos java, pero no uso guiones bajos en el código java.

Por ejemplo, podría tener una clase de User con el campo firstName en camel-case, al mismo tiempo necesito de alguna manera decirle a Jackson que first_name clave first_name de JSON al campo de clase firstName . ¿Es posible?

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


Aquí hay pocas respuestas que indiquen ambas estrategias para 2 versiones diferentes de la biblioteca Jackson a continuación:

Para Jackson 2.6. *

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

Para Jackson 2.7. *

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


Debería usar @JsonProperty en el campo en el que desea cambiar la asignación de nombre predeterminada.

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

Para más información: la API


Las respuestas anteriores con respecto a @JsonProperty y CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES son 100% precisas, aunque algunas personas (como yo) podrían estar tratando de hacer esto dentro de una aplicación Spring MVC con configuración basada en código. Aquí hay un código de muestra (que tengo dentro de Beans.java ) para lograr el efecto deseado:

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


Para versiones más nuevas de Spring, coloque este archivo de configuración en su proyecto (o simplemente tome Bean). Encontré que esto funciona tanto para el mapeo de respuesta como para el mapeo de cuerpo de solicitud.

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); } }


Puede configurar ObjectMapper para convertir camel case en nombres con un guión bajo

this.objectMapper.setPropertyNamingStrategy( PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);


Si desea esto para una clase individual, puede usar la @JsonNaming PropertyNamingStrategy con @JsonNaming , algo como esto:

@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) public static class Request { String businessName; String businessLegalName; }

Se serializará a:

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


Si es una aplicación de inicio de primavera, en el archivo application.properties, solo use

spring.jackson.property-naming-strategy = SNAKE_CASE

O Anote la clase de modelo con esta anotación.

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)