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)