問題
- 在日常開發中經常需要將一個json格式的字符串轉換成某個java對象,當json字符串中的字段跟java對象中定義的屬性名不一致時,就會出現轉換錯誤。
- 將一個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
@JsonProperty
是com.fasterxml.jackson.annotation
下使用頻率很高的一個常用註解,用於將json字符串中的某個字段和java對象中的某個屬性進行匹配映射,同時可以將java對象中的屬性轉換爲指定字段的json字符串。
演示
- 在java屬性上加上@JsonProperty註解:
@JsonProperty("jsonName")
private String name;
- 測試
@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));
}
- 運行結果
@SerializedName
@SerializedName
是com.google.gson.annotations
下的常用註解,作用和@JsonProperty
差不多。
演示
- 在java屬性上加上@SerializedName註解:
@SerializedName("jsonName")
private String name;
- 測試
@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);
}
- 運行結果
擴展
這裏只是簡單的列舉了兩個常見的註解,想要了解更多的註解和實例,可以查看以下官網進行學習: