web-dev-qa-db-fra.com

Jackson surmontant les soulignés en faveur de l'affaire du chameau

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;}
}
136
user1384991

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

90
Alex

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
291
thehpi

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)

98
adam.smithsonian01

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;

}
39
Arturo Volpe

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

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
    }

} 
8
Kenny Cason

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);
6
Anamika