除了FastJson,你也應該瞭解一下Jackson(一)
阿新 • • 發佈:2020-06-06
在上月末的時候收到一條關於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