Jackson deve davası lehine alt çizgilerin üstesinden geldi


160

İnternetten bir JSON dizesi alıyorum; Gördüğüm çoğu JSON gibi alt çizgilerle ayrılmış uzun anahtarlar içeriyor. Esasen, amacım JSON'u java nesnelerine serileştirmek, ancak java kodunda alt çizgi kullanmıyorum.

Örneğin, deve durumda alan Userile bir sınıf olabilir firstName, aynı anda Jackson bir şekilde first_nameJSON firstNamesınıf alanı anahtar eşlemek için söylemek gerekir . Mümkün mü?

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

Yanıtlar:


104

@JsonPropertyVarsayılan ad eşlemesini değiştirmek istediğiniz alanı kullanmalısınız .

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

Daha fazla bilgi için: API


86
Bunu yapmayın, yoksa her mülk için yapmanız gerekir. Aşağıdaki theppi yanıtına bakın.
Ryan Shillington

Yalnızca bir özelliğe açıklama ekleyebildim, ancak oluşturulan dizede özelliklerin sırasını değiştirdi: ek açıklama özellikleri en son ortaya çıktı. (Jackson 2.3.0)
eebbesen

1
@RyanShillington - Yanlışsam beni düzeltin, ancak ayrıştırdığınız JSON dizesi tutarlı bir biçim kullanmıyorsa, yani hem camelCase hem de alt çizgi kullanıyorsa, bu tek seçeneğiniz nedir?
DavidR

@DavidR Doğru. Kaynak verileri düzeltemediğinizi varsayıyorum? Bu berbat.
Ryan Shillington

@PaulTsai tamam, onları kullanmaktan çekinmeyin :)
Alex

351

ObjectMapperDeve durumunu alt çizgi içeren isimlere dönüştürmek için yapılandırabilirsiniz :

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

Veya bu açıklama ile belirli bir model sınıfına açıklama ekleyin:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

Jackson 2.7'den önce, sabitin adı:

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

5
Bunun yalnızca Jackson 1.9'da tanıtıldığını unutmayın.
David Moles

62
@deprecated 2.7'den beri bunun yerine SNAKE_CASE kullanın;
Thermech

1
one qq: snake_case adlandırma stratejisini kullandığımda alt çizgileri olan json dosyaları deve durumuna serileştirilecek mi?
Ram Patra

2
@Ramswaroop Evet, bu Jackson'ı hem konuşur hem de snake_case'yi bekler
Drew Stephens

1
@Ramswaroop Benim için Jackson 2.7.3 ve sadece @JsonProperty(normal camelCaseJava özelliklerinden çıkarım adı) ile açıklamalı özellikler ile PropertyNamingStrategy.SNAKE_CASEserileştirme, (kullandığım gibi) camelCase JSON ile çalışmayı durdurdu ve snake_case gerektirir.
Drew Stephens

119

Eğer bir bahar önyükleme uygulaması, application.properties dosyasında, sadece kullanın

spring.jackson.property adlandırma strateji = SNAKE_CASE

Veya bu ek açıklama ile model sınıfına açıklama ekleyin.

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)


3
"@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)" ile benim sınıf ek açıklama yaparsanız çalışır. Ama eğer "application.properties" de "spring.jackson.property-naming-Strategy = SNAKE_CASE" kullanırsam işe yaramaz. "Spring Boot (v2.0.0.BUILD-SNAPSHOT)" kullanıyorum. Hiç fikrin var mı ?
Bruno

1
Aynı burada, spring.jackson.property-naming-strategy=SNAKE_CASEçalışmıyor, Spring Boot 2.0 kullanıyorum
soulmachine

1
burada aynı, spring.jackson.property-naming-Strategy = SNAKE_CASE çalışmıyor, Spring Boot 2.0.5 kullanıyorum. Ancak ek açıklama kullanmak benim için işe yarıyor
Neo Pham

Belki senin ObjectMapperBahar tarafından yaratılmaz? Bir ObjectMapper döndüren @Bean yöntemiyle bir @Configuration sınıfı oluşturun. Bunun gerekli olup olmadığından emin değilim.
Ondra Žižka

48

Bunu tek bir sınıf için istiyorsanız , @JsonNaming ile PropertyNamingStrategy'yi kullanabilirsiniz , şöyle :

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

    String businessName;
    String businessLegalName;

}

Şuraya serileştirilecek:

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

Yana içinde lehine önerilmemektedir kullanmanız gereken böylece,:Jackson 2.7LowerCaseWithUnderscoresStrategySnakeCaseStrategy

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

    String businessName;
    String businessLegalName;

}

29

Bazı insanlar (benim gibi) kod tabanlı yapılandırmaya sahip bir Spring MVC uygulaması içinde yapmaya çalışıyor olsa da, yukarıdaki @JsonPropertyve CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES% 100 doğru yanıtlar . Beans.javaİstenen efekti elde etmek için örnek kod (içeride var ):

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

9
Bahar Boot için alternatif, içeri Bahar Önyükleme <= 1.3, kullanıyorsanız application.propertieseklenti spring.jackson.property-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCOR‌​ES. Spring Boot 1.4 için spring.jackson.property-naming-strategy=SNAKE_CASEbunun yerine kullanın.
Döküm Kek

1
@zapl evet haklısın, muhtemelen spring-boot sürümü yerine jackson'un versiyonundan bahsettim. Karışıklığı önlemek için bu yorumu sileyim.
Ram Patra

1
Jackson'ın 2.7 sürümünden itibaren SNAKE_CASE. Bu benim için çalıştı: final ObjectMapper objectMapper = new ObjectMapper().setPropertyNamingStrategy( PropertyNamingStrategy.SNAKE_CASE);
Jonathan

12

Mevcut en iyi uygulama Jackson'ı application.yml(veya properties) dosyasında yapılandırmaktır .

Misal:

spring:
  jackson:
    property-naming-strategy: SNAKE_CASE

Daha karmaşık yapılandırma gereksinimleriniz varsa, Jackson'ı programlı olarak da yapılandırabilirsiniz.

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
    }

} 

Yüklenen ve bunu geçersiz kılan başka bir jackson2objectmapper örneğiniz olup olmadığını biliyor musunuz? Ve bu fasülyenin bile yüklendiğini doğrulayabilir misiniz?
Kenny Cason

Ayrıca DuffJ'in çözümüne koşuşturma verin. Oldukça benzer.
Kenny Cason

Özellikleri tweaking doğru yol olduğunu düşünüyorum; ve tavsiye ederim. Bu da aynısını yapıyor.
WesternGun

@WesternGun iyi çağrı. Bunu mümkünse yaml / properties üzerinden yapmaya meyilliyim.
Kenny Cason

6

Burada, Jackson kütüphanesinin 2 farklı sürümü için her iki stratejiyi de gösteren birkaç cevap vardır:

Jackson 2.6 için. *

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

Jackson 2.7 için. *

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.SNAKE_CASE);

yine bazı değerler kullanımdan kaldırıldı, şimdi KEBAB_CASE var, yum!
Kalpesh Soni

FTR: kebap davası snake_case ;-) değil
René
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.