ジャクソンがキャメルケースを支持してアンダースコアを克服


160

インターネットからJSON文字列を取得します。ほとんどのJSONと同様に、アンダースコアで区切られた長いキーが含まれています。基本的に、私の目標はJSONをjava-objectsに逆シリアル化することですが、java-codeではアンダースコアを使用しません。

たとえば、キャメルケースのフィールドを持つUserクラスがあるかもしれませんがfirstName、同時に何とかしてfirst_nameJSONからfirstNameクラスフィールドにキーをマップするようにJacksonに指示する必要があります。出来ますか?

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

回答:


103

@JsonPropertyデフォルトの名前マッピングを変更するフィールドでを使用する必要があります。

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

詳細:API


86
これを行わないでください。そうしないと、すべてのプロパティに対して行う必要があります。以下のhhpiの応答を参照してください。
Ryan Shillington

注釈を付けることができたのは1つのプロパティだけでしたが、生成された文字列のプロパティの順序が変更されました。注釈付きのプロパティは最後に表示されました。(ジャクソン2.3.0)
eebbesen 2013

1
@RyanShillington-私が間違っている場合は修正してください。ただし、解析元のJSON文字列が一貫した形式を使用していない場合、つまりキャメルケースとアンダースコアの両方を使用している場合、これが唯一のオプションですか?
DavidR 2015年

@DavidR正解です。ソースデータを修正できないと思いますか?それは最悪です。
Ryan Shillington

@PaulTsai承知しました。お気軽にご利用ください:)
Alex

351

ObjectMapperキャメルケースをアンダースコア付きの名前に変換するようにを設定できます。

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

または、このアノテーションで特定のモデルクラスにアノテーションを付けます。

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

ジャクソン2.7以前は、この定数は次の名前でした。

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

5
これはJackson 1.9でのみ導入されたことに注意してください。
David Moles 2013

62
@deprecated 2.7以降では、代わりにSNAKE_CASEを使用します。
テルメック2016年

1
qq:snake_caseネーミング戦略を使用すると、アンダースコアのあるjsonファイルがキャメルケースにデシリアライズされますか?
Ram Patra 2016

2
@Ramswaroopはい、これによりジャクソンはsnake_caseを話し、期待するようになります
Drew Stephens

1
@Ramswaroopジャクソン2.7.3と@JsonProperty(通常のcamelCaseJavaプロパティから推論された名前)だけでアノテーションが付けられたプロパティPropertyNamingStrategy.SNAKE_CASEを使用すると、(以前使用していた)キャメルケースJSONでの逆シリアル化が機能しなくなり、snake_caseが必要になります。
ドリュースティーブンス

119

スプリングブートアプリケーションの場合、application.propertiesファイルで、

spring.jackson.property-naming-strategy = SNAKE_CASE

または、この注釈でモデルクラスに注釈を付けます。

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)


3
「@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)」でクラスに注釈を付けると、機能します。しかし、「application.properties」で「spring.jackson.property-naming-strategy = SNAKE_CASE」を使用すると、使用できません。「Spring Boot(v2.0.0.BUILD-SNAPSHOT)」を使用しています。あなたはなにか考えはありますか ?
ブルーノ

1
ここでも同じ、spring.jackson.property-naming-strategy=SNAKE_CASE動作しません
。SpringBoot

1
ここでも同じです、spring.jackson.property-naming-strategy = SNAKE_CASEは機能しません。SpringBoot 2.0.5を使用しています。しかし、注釈の使用は私にとっては
Neo Pham '26

たぶん、あなたObjectMapperは春によって作成されたのではありませんか?ObjectMapperを返す@Beanメソッドで@Configurationクラスを作成します。これが必要かどうかはわかりません。
OndraŽižka19年

48

単一クラスにこれが必要な場合は、次のように@JsonNamingPropertyNamingStrategyを使用できます。

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

    String businessName;
    String businessLegalName;

}

シリアル化します:

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

以降の賛成で推奨されていませんので、あなたが使用する必要があります:Jackson 2.7LowerCaseWithUnderscoresStrategySnakeCaseStrategy

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

    String businessName;
    String businessLegalName;

}

29

上記の解答@JsonPropertyとは、CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES(私のような)一部の人々は、コードベースの構成でのSpring MVCアプリケーション内でこれを実行しようとしているかもしれませんが、100%正確です。Beans.java希望する効果を実現するためのサンプルコード(内部にある)を次に示します。

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

9
Spring Boot <= 1.3を使用している場合は、Spring Bootの代替としてapplication.propertiesaddを使用しspring.jackson.property-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCOR‌​ESます。Spring Boot 1.4の場合は、spring.jackson.property-naming-strategy=SNAKE_CASE代わりに使用してください。
ダンプケーキ2016年

1
@zaplはい、その通りです。おそらく、スプリングブートのバージョンではなく、ジャクソンのバージョンについて述べました。混乱を避けるため、コメントを削除します。
Ram Patra 2016

1
ジャクソンのバージョン2.7の時点ではSNAKE_CASEです。これは私にとってうまくfinal ObjectMapper objectMapper = new ObjectMapper().setPropertyNamingStrategy( PropertyNamingStrategy.SNAKE_CASE);
ジョナサン

12

現在のベストプラクティスは、application.yml(またはproperties)ファイル内でジャクソンを設定することです。

例:

spring:
  jackson:
    property-naming-strategy: SNAKE_CASE

より複雑な構成要件がある場合は、プログラムでJacksonを構成することもできます。

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
    }

} 

jackson2objectmapperの別のインスタンスがロードされ、このインスタンスをオーバーライドしているかどうかを知っていますか?そして、このBeanもロードされていることを確認できますか?
ケニーケイソン2018

また、DuffJのソリューションを試してみてください。それはかなり似ています。
ケニーケイソン2018

プロパティを調整することは正しい方法だと思います。とお勧めします。これは同じことです。
WesternGun

@WesternGun良い電話。私は、可能であればyaml / propertiesを使用してこれを行う傾向があります。
ケニーケーソン、

6

以下の2つの異なるバージョンのジャクソンライブラリの両方の戦略を示すいくつかの回答があります。

ジャクソン2.6の場合。*

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

ジャクソン2.7の場合。*

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

再び、いくつかの値を非推奨にしましたが、今ではKEBAB_CASEがあります、yum!
Kalpesh Soni

FTR:ケバブケースはsnake_caseではありません;-)
ルネ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.