Je récupère une chaîne JSON sur Internet; Comme la plupart des JSON que j'ai vus, il comprend de longues clés séparées par des traits de soulignement. Mon objectif est essentiellement de désérialiser JSON en objets Java, mais je n'utilise pas de traits de soulignement dans le code Java.
Par exemple, je pourrais avoir une classe User
avec firstName
champ dans camel-case, simultanément je dois dire à Jackson de mapper first_name
clé de JSON au champ de classe firstName
. C'est possible?
class User{
protected String firstName;
protected String getFirstName(){return firstName;}
}
Vous devriez utiliser le @JsonProperty
sur le champ pour lequel vous souhaitez modifier le mappage de nom par défaut.
class User{
@JsonProperty("first_name")
protected String firstName;
protected String getFirstName(){return firstName;}
}
Pour plus d’informations: API
Vous pouvez configurer ObjectMapper pour convertir le cas de chameau en noms avec un trait de soulignement:
this.objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
Avant Jackson 2.7, la constante était nommée:
PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
Si c'est une application de démarrage printanier, dans le fichier application.properties, utilisez simplement
spring.jackson.property-naming-strategy = SNAKE_CASE
Ou Annotez la classe de modèle avec cette annotation.
@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)
Si vous voulez cela pour une seule classe, vous pouvez utiliser le PropertyNamingStrategy avec le @ JsonNaming , quelque chose comme ceci:
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public static class Request {
String businessName;
String businessLegalName;
}
Sera sérialisé à:
{
"business_name" : "",
"business_legal_name" : ""
}
Puisque Jackson 2.7
le LowerCaseWithUnderscoresStrategy
est déconseillé au profit de SnakeCaseStrategy
, vous devriez donc utiliser:
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public static class Request {
String businessName;
String businessLegalName;
}
Les réponses ci-dessus concernant @JsonProperty
et CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
sont exacts à 100%, bien que certaines personnes (comme moi) tentent peut-être de le faire dans une application Spring MVC avec une configuration basée sur du code. Voici un exemple de code (que j'ai à l'intérieur Beans.Java
) pour obtenir l'effet souhaité:
@Bean
public ObjectMapper jacksonObjectMapper() {
return new ObjectMapper().setPropertyNamingStrategy(
PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
}
La meilleure pratique actuelle consiste à configurer Jackson dans le application.yml
(ou properties
).
Exemple:
spring:
jackson:
property-naming-strategy: SNAKE_CASE
Si vous avez des exigences de configuration plus complexes, vous pouvez également configurer Jackson par programmation.
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
}
}
Il y a peu de réponses ici indiquant les deux stratégies pour 2 versions différentes de la bibliothèque de Jackson ci-dessous:
Pour Jackson 2.6. *
ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
Pour Jackson 2.7. *
ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
PropertyNamingStrategy.SNAKE_CASE);