2012-05-09 18 views
85

Pobieram ciąg JSON z Internetu; tak jak większość JSON-a, który widziałem, zawiera długie klucze oddzielone podkreśleniami. Zasadniczo moim celem jest deserializacja JSON-a do obiektów java, ale ja nie stosuję podkreśleń w kodzie java.Jackson pokonując podkreślenia na rzecz wielbłąda

Na przykład, mogę mieć User klasę z firstName pola w wielbłądach przypadku równocześnie muszę jakoś powiedzieć Jackson mapować first_name klucz od JSON do firstName klasy dziedzinie. Czy to możliwe?

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

Odpowiedz

59

Należy użyć @JsonProperty na pola, które chcesz zmienić domyślne odwzorowanie nazw.

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

Aby uzyskać więcej informacji: the API

+49

Nie rób tego, bo inaczej musisz to zrobić dla każdej nieruchomości. Zobacz odpowiedź theshpi poniżej. –

+0

Udało mi się tylko opisać jedną właściwość, ale zmieniło się kolejność właściwości w wygenerowanym ciągu: pojawiły się ostatnio adnotowane właściwości. (Jackson 2.3.0) – eebbesen

+1

@RyanShillington - Popraw mnie, jeśli się mylę, ale to jest twoja jedyna opcja, jeśli ciąg JSON, z którego parsujesz, nie używa spójnego formatu, tzn. Używa zarówno camelCase, jak i podkreślenia? – DavidR

218

Można skonfigurować ObjectMapper przekonwertować sprawę wielbłądowi nazwy znakiem podkreślenia

this.objectMapper.setPropertyNamingStrategy(
    PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); 
+5

Należy zauważyć, że zostało to wprowadzone tylko w Jackson 1.9. –

+38

@deprecated Od 2.7 zamiast tego użyj SNAKE_CASE; – Thermech

+0

jedno pytanie qq: kiedy używam strategii nazywania snake_case pliki json z podkreśleniami będą deserialized na wielbłądzie? –

22

Powyższe odpowiedzi dotyczących @JsonProperty i CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES są w 100% dokładne, chociaż niektórzy ludzie (jak ja) mogą próbować to zrobić w aplikacji Spring MVC z konfiguracją opartą na kodzie. Oto przykładowy kod (które mam wewnątrz Beans.java), aby osiągnąć pożądany efekt:

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

Alternatywa dla Spring Boot, jeśli używasz Spring Boot <= 1.3, w 'application.properties' dodaj' spring.jackson.property-nazing-strategy = CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCOR ES'. W Spring Boot 1.4 użyj 'spring.jackson.property-nazing-strategy = SNAKE_CASE'. –

+1

@zapl Tak, masz rację, prawdopodobnie wspomniałem wersję Jacksona zamiast wersji Spring Boot. Pozwól mi usunąć ten komentarz, aby uniknąć nieporozumień. –

+1

Od wersji 2.7 Jacksona to SNAKE_CASE. To działało dla mnie: 'final ObjectMapper objectMapper = new ObjectMapper(). SetPropertyNamingStrategy ( PropertyNamingStrategy.SNAKE_CASE);' – Jonathan

17

Jeśli chcesz to dla pojedynczej klasy, można użyć PropertyNamingStrategy z @JsonNaming, coś takiego:

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

    String businessName; 
    String businessLegalName; 

} 

Czy serializacji do:

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

Jeśli jej zastosowanie bagażnika sprężyna, W application.properties pliku, wystarczy użyć

spring.jackson.property nazewnictwa-strategy = SNAKE_CASE

Albo Opisywanie klasę modelu z tej adnotacji.

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)

+0

Jeśli opiszę moją klasę za pomocą "@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)" to działa. Ale jeśli użyję "spring.jackson.property-nazing-strategy = SNAKE_CASE" w "application.properties", to nie będzie. Używam "Spring Boot (v2.0.0.BUILD-SNAPSHOT)". Czy masz jakies pomysły ? – Bruno

4

nowsze wersje wiosną, spadek ten plik konfiguracyjny do projektu (lub po prostu wziąć Bean). Zauważyłem, że działa to zarówno w przypadku mapowania odpowiedzi, jak i mapowania treści żądania.

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

} 
+0

To nie działa dla mnie. – user216661

+0

Czy wiesz, czy masz inne wystąpienie ładowanego jackson2objectmapper i przesłonięcie tego? Czy możesz potwierdzić, że nawet ta fasola jest ładowana? –

+0

Daj również rozwiązanie DuffJowi wir. Jest całkiem podobny. –

Powiązane problemy