時間格式化
//設置jackson時區,其根據數據庫時區將數據庫得到的時間轉化爲GMT+8時區
spring.jackson.time-zone=GMT+8
//jackson時間格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
@JsonFormat 使用
我們可以有兩種用法(我知道的),在對象屬性上,或者在屬性的 getter
方法上,如下代碼所示:
//放在變量上
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date updateTime;
//放在get方法上
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
public Date getUpdateTime() {
return updateTime;
}
@JsonFormat 相差8小時問題
//加時區(推薦統一配置jsckson時區)
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date updateTime;
序列化字段忽略
@JsonIgnoreProperties(ignoreUnknown=true)
放在類上,json轉爲此類對象時,忽略json中多餘屬性
@JsonIgnore
放在變量上,無論是json->object還是object->json都忽略此變量
@JsonProperty(access= JsonProperty.Access.READ_ONLY)
放在變量上,可以配置只讀/只寫/讀寫。控制何時忽略此屬性。
ObjectMapper
https://www.jianshu.com/p/03eeef29213d
推薦將POJO的所有成員變量添加public getter和setter方法和無參構造器,以免出現轉換丟失的BUG或異常
主要方法
writeValueAsString
writeValue
readValue
- 定義一個Product類
class Product {
private String id;
private String name;
private Integer price;
public String getId() {
return id;
}
public String getName() {
return name;
}
public Integer getPrice() {
return price;
}
}
@jsonignore
放在屬性上,代表序列化/反序列化無視此屬性
- 將Java Object to JSON
ObjectMapper objectMapper = new ObjectMapper();
Product product = new Product("0001", "name", 1);
String json=objectMapper.writeValueAsString(product);
// 寫入文件
objectMapper.writeValue(new File("target/product.json"), product);
- 將 Json String 賦值給 一個類
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"id\": \"0001\", \"name\" : \"Coca Cola\", \"price\": 3}";
Product product = objectMapper.readValue(json, Product.class);
// product.getId(); 0001
// 直接讀取文件裏面的值:
Product product = objectMapper.readValue(new File("target/json_car.json"), Product.class);
- 將JSON Array String 賦值給List<>
String jsonCarArray = "[{\"id\": \"0001\", \"name\" : \"Coca Cola\", \"price\": 3}]";
//泛型支持
List<Product> listProduct = objectMapper.readValue(jsonCarArray , new TypeReference<List<Product>>() {});
List list = objectMapper.readValue(jsonCarArray, List.class);
- 將JSON String 賦值給map<>
String json = "{\"id\": \"0001\", \"name\" : \"Coca Cola\", \"price\": 3}";
Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});
- TypeReference支持多層複雜泛型
{
"name": "id1",
"map": {
"1": "2",
"2": [1,2,3,4]
},
"list": [
{
"name": "son",
"map": {
},
"list": [
{
"name": "hhhhh",
"map": {
},
"list": []
}
]
}
]
}
TypeReference<Pojo>可以將上面json轉化爲Pojo對象
class Pojo {
private String name;
private HashMap<Object,Object> map=new HashMap();
private List<Pojo> list =new ArrayList<>();
public Pojo() {
}
public Pojo(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HashMap<Object, Object> getMap() {
return map;
}
public void setMap(HashMap<Object, Object> map) {
this.map = map;
}
public List<Pojo> getList() {
return list;
}
public void setList(List<Pojo> list) {
this.list = list;
}
@Override
public String toString() {
return "Pojo{" +
"name='" + name + '\'' +
", map=" + map +
", list=" + list +
'}';
}
}
- configure ObjectMapper to ignore unknown properties in the JSON
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
轉換的類裏面的getter方法必須是public的,纔可以獲取到