首頁  >  文章  >  Java  >  如何在 Jackson 中使用不同的屬性名稱進行序列化和反序列化?

如何在 Jackson 中使用不同的屬性名稱進行序列化和反序列化?

Barbara Streisand
Barbara Streisand原創
2024-10-26 06:30:30337瀏覽

How to Use Different Property Names for Serialization and Deserialization in Jackson?

Jackson 中序列化和反序列化的不同屬性名稱

JSON 屬性在序列化和反序列化期間可以有不同的名稱嗎? Jackson 庫允許這種自訂。

例如,考慮一個座標類別:

<code class="java">class Coordinates {
  int red;
}</code>

從JSON 反序列化時,您需要以下格式:

<code class="json">{
  "red": 12
}</code>

但是,在序列化過程中,它的格式應為:

<code class="json">{
  "r": 12
}</code>

使用@JsonProperty 註解實現此功能無法按預期工作,因為getter 和setter 具有不同的名稱:

<code class="java">class Coordinates {
    int red;

    @JsonProperty("r")
    public byte getRed() {
      return red;
    }

    @JsonProperty("red")
    public void setRed(byte red) {
      this.red = red;
    }
}</code>

這會導致「無法辨識的欄位「紅色」」異常。

要解決此問題,請為getter 和setter 使用不同的方法名稱:

<code class="java">public class Coordinates {
    byte red;

    @JsonProperty("r")
    public byte getR() {
      return red;
    }

    @JsonProperty("red")
    public void setRed(byte red) {
      this.red = red;
    }
}</code>

這樣,Jackson 會將屬性識別為不同的字段,允許在序列化和反序列化過程中使用不同的名稱。

例如:

<code class="java">Coordinates c = new Coordinates();
c.setRed((byte) 5);

ObjectMapper mapper = new ObjectMapper();
System.out.println("Serialization: " + mapper.writeValueAsString(c));

Coordinates r = mapper.readValue("{\"red\": 25}", Coordinates.class);
System.out.println("Deserialization: " + r.getR());</code>

列印:

Serialization: {"r": 5}
Deserialization: 25

以上是如何在 Jackson 中使用不同的屬性名稱進行序列化和反序列化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn