jackson 基本用法

本文详细介绍了如何使用Jackson库进行时间格式化,包括设置全局时区、指定日期格式,以及如何通过@JsonFormat注解处理时区差异。同时,深入探讨了ObjectMapper的配置与使用,如序列化、反序列化Java对象与JSON字符串,处理复杂泛型,以及配置忽略未知属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间格式化

//设置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 gettersetter方法和无参构造器,以免出现转换丢失的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的,才可以获取到

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值