ジャクソンを使用してJSONのフィールド名を変更する方法


169

私はjacksonを使用して、私のオブジェクトをjsonに変換しています。オブジェクトには2つのフィールドがあります。

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}

これをjQueryのオートコンプリート機能で使用したいので、jsonでは「id」を「value」として表示し、「name」を「label」として表示します。ジャクソンのドキュメンテーションはこれについて明確ではなく、私は必要なことをするように遠く離れているように見えるすべての注釈を試しましたが、json としてname表示されlabelたりid、表示されたりすることはできませんvalue

これを行う方法を知っている人はいますか?


エンティティ( "City")を他の目的やビジネスロジックに使用する可能性がある場合、そのJSON表現をラベルと値として定義することは避けます。OTOHこれがコンボに使用される純粋な参照データである場合は、さらに多くなる可能性があります-これらのすべてをカバーする汎用エンティティ(ペアまたはオプション)を作成することは、検討すべき可能なアプローチです。
トーマスW

回答:


323

@JsonPropertyを使用してみましたか?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

   public void setId(Long id){ this.id = id; }
}

5
はい、私はそれを試しました、しかし私がやってい@JsonProperty(value="label")てそれがうまくいかなかった、あなたが提案したように私はそれを試しましたそしてそれはうまくいきました!おかげで、これは本当にコードを単純化するのに役立ちます。
Ali

同様の要件があります。RESTEasyでジャクソンを使用しているだけで、これは機能しません:-/奇妙です!
Niks、2014年

Jacksonが実際に構成されたプロバイダーであり、他のものではないことを確認してください
henrik_lundgren 14年

2
ジャクソン(またはGSON)を利用して、既存のJSON文字列のプロパティ名を変更する方法はありますか?
Don Cheadle

私はオブジェクト@JsonProperty( "オブジェクト")val jsonObject:文字列を使用しましたが、失敗しました
Raju yourPepe

45

org.codehaus.jackson.annotate.JsonPropertyJackson 1.xとcom.fasterxml.jackson.annotation.JsonPropertyJackson 2.xにあることに注意してください。使用しているObjectMapperを(どのバージョンから)確認し、適切な注釈を使用していることを確認してください。


org.json4s.jackson名前空間もあります。:)そしておそらくjacksonYMMVの他の実装。
ジェシーチザム

14

フィールドの名前を変更するオプションがもう1つあります。

ジャクソンミックスイン

アノテーションを付けることができないサードパーティのクラスを扱う場合、またはクラスをジャクソン固有のアノテーションで汚染したくない場合に役立ちます。

ミックスインのジャクソンのドキュメントは古くなっているので、このはより明確にすることができます。本質的には、シリアル化を希望どおりに行うミックスインクラスを作成します。次に、それをObjectMapperに登録します。

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);

フィールドをシリアル化/非シリアル化するとき、これがパフォーマンスに影響を与えるのは不思議ですか?
chanllen

2

ジャクソン

ジャクソンを使用している場合は、 @JsonPropertyアノテーションをて特定のJSONプロパティの名前をカスタマイズできます。

したがって、エンティティフィールドに注釈を付けて@JsonProperty、次のようにカスタムJSONプロパティ名を指定するだけです。

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEEまたはJakartaEE JSON-B

JSON-Bは、JavaオブジェクトとJSONの間の変換を行うための標準バインディングレイヤーです。JSON-Bを使用している場合は、@JsonbPropertyアノテーションを使用してJSONプロパティ名をオーバーライドできます。

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.