私は、ゲッター/セッターに@JsonPropertyアノテーションを持つ特定のビットコードを継承しました。目的は、Jacksonライブラリを使用してオブジェクトをシリアル化するときに、フィールドにその特定の名前が付けられるようにすることです。
現在のコード:
private String fileName;
@JsonProperty("FILENAME")
public String getFileName()
{
return fileName;
}
@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
this.fileName = fileName;
}
次に、別のツールのために、フィールドにもJsonPropertyで注釈を付ける必要があります。したがって、これは私の変更されたコードになります:
@JsonProperty("FILENAME")
private String fileName;
@JsonProperty("FILENAME")
public String getFileName()
{
return fileName;
}
@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
this.fileName = fileName;
}
誰でもこの同じ注釈をフィールドとゲッター/セッターの両方で使用しましたか?私はネットを見回したが、何も見なかった。
コードをコンパイルして実行しましたが、これが今後問題を引き起こすかどうかはわかりません。これについて何か考えはありますか?
いくつかのテストに基づいた私の観察では、プロパティ名と異なる名前が有効になるということです。
例えばケースを少し変更することを検討してください。
@JsonProperty("fileName")
private String fileName;
@JsonProperty("fileName")
public String getFileName()
{
return fileName;
}
@JsonProperty("fileName1")
public void setFileName(String fileName)
{
this.fileName = fileName;
}
fileName
フィールドとメソッドgetFileName
の両方にfileName
という正しいプロパティ名があり、setFileName
には異なるfileName1
があります。この場合ジャクソンは、逆シリアル化の時点でjsonでfileName1
属性を探し、シリアル化の時点でfileName1
という属性を作成します。
ここで、3つの@JsonPropertyがすべてfileName
のデフォルトのプロパティ名と異なる場合、それらのうちの1つを属性(FILENAME
)として選択し、 3つが異なり、例外がスローされます。
Java.lang.IllegalStateException: Conflicting property name definitions
既存の良い答えに加えて、ジャクソン1.9は「プロパティの統合」を追加することで処理を改善したことに注意してください。
ジャクソン1.8以前では、何をどのようにシリアル化するか(JSONを記述する)を決定するときに、フィールドとゲッターの注釈のみが使用されていました。そして、デシリアライズ(JSONの読み取り)のための唯一のセッターアノテーション。これには、ゲッターとセッターの両方に注釈を付けるなど、「余分な」注釈の追加が必要になる場合がありました。
Jackson 1.9以上では、これらの追加の注釈は必要ありません。それらを追加することはまだ可能です。また、異なる名前が使用されている場合、「分割」プロパティを作成できます(1つの名前を使用してシリアル化、別の名前を使用して逆シリアル化)。これは、名前の変更に役立つことがあります。