@JsonProperty和@SerializedName對比

問題

  1. 在日常開發中經常需要將一個json格式的字符串轉換成某個java對象,當json字符串中的字段跟java對象中定義的屬性名不一致時,就會出現轉換錯誤。
  2. 將一個java對象轉換成json格式的字符串,並且要求轉換後的字符串中字段名跟原java對象中的屬性名不一致。
例子:1. 將json字符串轉換成Java對象;2. 將java對象轉換成指定的json字符串
  • json格式的字符串
String jsonBean1 = "{\"jsonName\":\"xyz\",\"age\":\"12\",\"address\":\"china\"}";
  • java對象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MyBean {
    private String name;
    private String address;
    private int age;
    @Override
    public String toString() {
        return "MyBean{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", age=" + age +
                '}';
    }
}

解決方法

       如何解決上面兩個常見問題呢?其實很簡單只需要在java對象的屬性上加上@JsonProperty@SerializedName即可解決問題。

       @JsonProperty@SerializedName在功能上是可以互換的,都可以滿足以上要求,只是在用法上略有不同。


@JsonProperty

@JsonPropertycom.fasterxml.jackson.annotation下使用頻率很高的一個常用註解,用於將json字符串中的某個字段和java對象中的某個屬性進行匹配映射,同時可以將java對象中的屬性轉換爲指定字段的json字符串。

演示

  1. 在java屬性上加上@JsonProperty註解:
    @JsonProperty("jsonName")
    private String name;
  1. 測試
@Test
    public void testJsonProperty() throws IOException{
        String jsonBean1 = "{\"jsonName\":\"xyz\",\"age\":\"12\",\"address\":\"china\"}";
        ObjectMapper mapper = new ObjectMapper();
        Object myBean1 = mapper.readerFor(MyBean.class).readValue(jsonBean1);

        System.err.println("Convert json to java: "+ myBean1.toString());

        MyBean myBean = new MyBean("xyz", "China", 12);
        System.err.println("Conver java to json: " + mapper.writeValueAsString(myBean));
    }
  1. 運行結果
    在這裏插入圖片描述

@SerializedName

@SerializedNamecom.google.gson.annotations下的常用註解,作用和@JsonProperty差不多。

演示

  1. 在java屬性上加上@SerializedName註解:
    @SerializedName("jsonName")
    private String name;
  1. 測試
@Test
    public void testFromJeson() throws IOException {
        String jsonBean1 = "{\"jsonName\":\"xyz\",\"age\":\"12\",\"address\":\"china\"}";
        MyBean myBean = new MyBean("xyz", "China", 12);

        // 注意:寫法和@JsonProperty不同
        Gson gson = new Gson();
        MyBean myBean1 = gson.fromJson(jsonBean1, MyBean.class);
        System.err.println("jesonBean1: "+ myBean1.toString());

        String toJson = gson.toJson(myBean);
        System.err.println("toJson: " + toJson);
    }
  1. 運行結果
    在這裏插入圖片描述

擴展

這裏只是簡單的列舉了兩個常見的註解,想要了解更多的註解和實例,可以查看以下官網進行學習:

  1. https://www.baeldung.com/jackson-annotations
  2. http://www.javacreed.com/simple-gson-example/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章