Pobieram ciąg JSON z Internetu; jak większość JSON, widziałem, że zawiera długie klucze, które są oddzielone podkreśleniami. Zasadniczo moim celem jest deserializacja JSON w obiekty java, ale nie używam podkreślenia w kodzie java.
Na przykład, mogę mieć User
klasę z firstName
polem w przypadku wielbłąda, jednocześnie muszę jakoś powiedzieć Jacksonowi, aby zamapował first_name
klucz z JSON na firstName
pole klasy. Czy to możliwe?
class User{
protected String firstName;
protected String getFirstName(){return firstName;}
}
Możesz skonfigurować
ObjectMapper
konwersję wielkości wielbłądów na nazwy z podkreśleniem:Lub dodaj adnotację do określonej klasy modelu za pomocą tej adnotacji:
Przed Jacksonem 2.7 stała nosiła nazwę:
źródło
@JsonProperty
(nazwa wywnioskowana z normalnychcamelCase
właściwości Javy)PropertyNamingStrategy.SNAKE_CASE
spowodowała, że deserializacja przestała działać z camelCase JSON (tak jak wcześniej) i wymagała snake_case.Jeśli jest to aplikacja uruchamiana wiosną, w pliku application.properties po prostu użyj
Lub Opisz klasę modelu tą adnotacją.
źródło
spring.jackson.property-naming-strategy=SNAKE_CASE
nie działa, używam Spring Boot 2.0ObjectMapper
nie jest tworzony wiosną? Utwórz klasę @Configuration z metodą @Bean, która zwraca ObjectMapper. Nie jestem pewien, czy jest to konieczne.Jeśli chcesz to dla pojedynczej klasy, możesz użyć PropertyNamingStrategy z @JsonNaming , coś takiego:
Zostanie serializowany do:
Od w zastąpiona , dlatego należy używać:
Jackson 2.7
LowerCaseWithUnderscoresStrategy
SnakeCaseStrategy
źródło
Powyższe odpowiedzi dotyczące
@JsonProperty
iCAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
są w 100% dokładne, chociaż niektórzy ludzie (tacy jak ja) mogą próbować to zrobić wewnątrz aplikacji Spring MVC z konfiguracją opartą na kodzie. Oto przykładowy kod (który mam w środkuBeans.java
), aby osiągnąć zamierzony efekt:źródło
application.properties
addspring.jackson.property-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
. W przypadku Spring Boot 1.4 użyjspring.jackson.property-naming-strategy=SNAKE_CASE
zamiast tego.final ObjectMapper objectMapper = new ObjectMapper().setPropertyNamingStrategy( PropertyNamingStrategy.SNAKE_CASE);
Obecnie najlepszą praktyką jest skonfigurowanie Jacksona w
application.yml
(lubproperties
pliku ).Przykład:
Jeśli masz bardziej złożone wymagania konfiguracyjne, możesz również skonfigurować Jacksona programowo.
źródło
Poniżej znajduje się kilka odpowiedzi wskazujących obie strategie dla 2 różnych wersji biblioteki Jacksona:
Dla Jacksona 2.6. *
Dla Jackson 2.7. *
źródło