jackson 基本用法

時間格式化

//設置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的,纔可以獲取到

 

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