196 votes

Jackson surmonte les obstacles en faveur de l'étui à chameau.

Je récupère une chaîne JSON sur Internet ; comme la plupart des JSON que j'ai vus, elle comprend des clés longues séparées par des caractères de soulignement. Essentiellement, mon objectif est de désérialiser le JSON en objets java, mais je n'utilise pas d'underscores dans le code java.

Par exemple, je pourrais avoir un User classe avec firstName en minuscules, en même temps j'ai besoin d'une manière ou d'une autre de dire à Jackson de faire correspondre first_name de JSON à firstName champ de classe. Est-ce possible ?

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

444voto

thehpi Points 766

Vous pouvez configurer le ObjectMapper pour convertir la casse camel en noms avec un trait de soulignement :

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

Ou annoter une classe de modèle spécifique avec cette annotation :

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

Avant Jackson 2.7, la constante était nommée :

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

137voto

adam.smithsonian01 Points 1370

Si c'est une application spring boot, dans le fichier application.properties, utilisez simplement

spring.jackson.property-naming-strategy=SNAKE_CASE

Ou annoter la classe modèle avec cette annotation.

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

130voto

Alex Points 9063

Vous devez utiliser le @JsonProperty sur le champ dont vous voulez modifier l'affectation du nom par défaut.

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

Pour plus d'informations : le API

55voto

AVolpe Points 1068

Si vous voulez que cela se fasse pour une seule classe, vous pouvez utiliser la fonction Stratégie de dénomination des biens avec le @JsonNaming quelque chose comme ça :

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

    String businessName;
    String businessLegalName;

}

Sera sérialisé en :

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

Desde Jackson 2.7 le site LowerCaseWithUnderscoresStrategy est déprécié au profit de SnakeCaseStrategy vous devez donc utiliser :

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

    String businessName;
    String businessLegalName;

}

31voto

DuffJ Points 403

Les réponses ci-dessus concernant @JsonProperty y CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES sont 100% exactes, bien que certaines personnes (comme moi) puissent essayer de faire cela à l'intérieur d'une application Spring MVC avec une configuration basée sur le code. Voici un exemple de code (que j'ai dans l'application Beans.java ) pour obtenir l'effet désiré :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X