时间格式化
//设置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的,才可以获取到