4. JSON字串是如何被解析的?JsonParser瞭解一下
阿新 • • 發佈:2020-07-28
> 公司不是你家,領導不是你媽。本文已被 [**https://www.yourbatman.cn**](https://www.yourbatman.cn) 收錄,裡面一併有Spring技術棧、MyBatis、JVM、中介軟體等小而美的**專欄**供以免費學習。關注公眾號【**BAT的烏托邦**】逐個擊破,深入掌握,拒絕淺嘗輒止。
[TOC]
![](https://img-blog.csdnimg.cn/20200725140936285.png)
# 前言
各位好,我是A哥(YourBatman)。上篇文章:[3. 懂了這些,方敢在簡歷上說會用Jackson寫JSON](https://mp.weixin.qq.com/s/ZHb3P06IC4xElHwJqDepxw) 聊完,**流式API**的寫部分可以認為你已完全掌握了,本文了解它讀的部分。
![](https://img-blog.csdnimg.cn/20200723180943213.png)
## 版本約定
- Jackson版本:`2.11.0`
- Spring Framework版本:`5.2.6.RELEASE`
- Spring Boot版本:`2.3.0.RELEASE`
> 小貼士:截止到本文,本系列**前面**所有示例都只僅僅匯入`jackson-core`而已,後續若要新增jar包我會額外說明,否則相同
# 正文
什麼叫讀JSON?就是把一個JSON **字串** 解析為物件or樹模型嘛,因此也稱作解析JSON串。Jackson底層流式API使用`JsonParser`來完成**JSON字串**的解析。
## 最簡使用Demo
準備一個POJO:
```java
@Data
public class Person {
private String name;
private Integer age;
}
```
測試用例:把一個JSON字串繫結(封裝)進一個POJO物件裡
```java
@Test
public void test1() throws IOException {
String jsonStr = "{\"name\":\"YourBatman\",\"age\":18}";
Person person = new Person();
JsonFactory factory = new JsonFactory();
try (JsonParser jsonParser = factory.createParser(jsonStr)) {
// 只要還沒結束"}",就一直讀
while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
String fieldname = jsonParser.getCurrentName();
if ("name".equals(fieldname)) {
jsonParser.nextToken();
person.setName(jsonParser.getText());
} else if ("age".equals(fieldname)) {
jsonParser.nextToken();
person.setAge(jsonParser.getIntValue());
}
}
System.out.println(person);
}
}
```
執行程式,輸出:
```java
Person(name=YourBatman, age=18)
```
成功把一個JSON字串的值解析到Person物件。你可能會疑問,怎麼這麼麻煩?那當然,這是底層流式API,純**手動檔**嘛。你獲得了效能,可不要失去一些便捷性嘛。
> 小貼士:底層流式API一般面向“專業人士”,應用級開發使用高階API `ObjectMapper`即可。當然,讀完本系列就能讓你完全具備“專業人士”的實力