1. 程式人生 > >除了FastJson,你也應該瞭解一下Jackson(一)

除了FastJson,你也應該瞭解一下Jackson(一)

在上月末的時候收到一條關於fastjson安全漏洞的訊息,突然想到先前好像已經有好多次這樣的事件了(在fastjson上面)。關於安全方面,雖然中槍的機率微小,但是在這個資訊越來越複雜的時代,安全性也變得越來越重要,就像DevSecOps的誕生,在軟體交付的整個價值流中我們也需要注重安全這方面。當然我們現在不談關於FastJson的優劣,因為我們本文的目標是讓大家瞭解和掌握Jackson。 --- ## 概覽 Jackson是一個非常流行和高效的基於Java的庫,它可以序列化java物件或將java物件對映到JSON,反之亦然。當然除了Jackson,在Java中同類型的優秀的庫也有很多,比如: - [Gson](https://www.baeldung.com/java-json#gson) - [json-io](https://www.baeldung.com/java-json#jsonio) - [Genson](https://www.baeldung.com/java-json#genson) 關於哪一個最好或者哪一個最流行,沒有明確的答案。技術的種類繁多,每個人對與不同技術的態度也是不一樣。言歸正傳,文章主要還是討論Jackson的。本文主要講解我們處理Json中最常見的兩個操作: - 將Java物件序列化為JSON - JSON字串反序列化為Java物件 --- ## JavaObject to Json ### ObjectMapper ObjectMapper是一個對映器(或資料繫結器或編解碼器),提供了在Java物件(bean的例項)和JSON之間進行轉換的功能。 #### 首先定義一個簡單的Java類 ```java public class Car { private String color; private String type; // standard getters setters } ``` #### 將Java物件轉換成Json 我們使用ObjectMapper的*writeValue*相關Api來對Java物件進行序列化操作 ```java ObjectMapper objectMapper = new ObjectMapper(); Car car = new Car("blue","c1"); System.out.println(objectMapper.writeValueAsString(car)); ``` 此時輸出 ```json {"color":"blue","type":"c1"} ``` #### 更多 ObjectMapper的*writeValue*相關Api還提供了很多便利的Json序列化操作方法,比如:將物件序列化成Json位元組陣列的`writeValueAsBytes()`方法、自定義輸出源的`writeValue()`方法... ```java ObjectMapper objectMapper = new ObjectMapper(); Car car = new Car("blue","c1"); objectMapper.writeValue(new File("./xxx.txt"),car); ``` 執行上述程式碼,Java物件的序列化Json將被輸出到xxx.txt檔案。 ![image-20200605232424859](https://tva1.sinaimg.cn/large/007S8ZIlgy1gfhtu3199qj30fk04idfu.jpg) --- ## Json to JavaObject #### 將Json String轉換成Java Object ```java ObjectMapper objectMapper = new ObjectMapper(); String json = "{\"color\":\"blue\",\"type\":\"c1\"}"; Car car = objectMapper.readValue(json, Car.class); ``` readValue()方法也接受其他形式的輸入,比如包含JSON字串的檔案: ```java ObjectMapper objectMapper = new ObjectMapper(); Car car = objectMapper.readValue(new File("./xxx.txt"), Car.class); System.out.println(car); ``` --- ## JSON to Jackson JsonNode ### JsonNode 一個JSON可以被解析成一個JsonNode物件,用來從一個特定的節點檢索資料. 使用readTree()方法,我們可以將Json字串轉換成JsonNode ```java ObjectMapper objectMapper = new ObjectMapper(); String json = "{ \"color\" : \"Black\", \"type\" : \"FIAT\" }"; JsonNode jsonNode = objectMapper.readTree(json); System.out.println(jsonNode.findValue("type").asText()); // 打印出“FAIT” ``` --- ## JSONArrayString to JavaList ```java ObjectMapper objectMapper = new ObjectMapper(); String jsonCarArray = "[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : 3. \"Red\", \"type\" : \"FIAT\" }]"; List listCar = objectMapper.readValue(jsonCarArray, new TypeReference>() {}); ``` --- ## JSONString to JavaMap ```java ObjectMapper objectMapper = new ObjectMapper(); String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }"; Map map = objectMapper.readValue(json, new TypeReference>() { }); ``` ---