Java Jackson-jr 庫指南
1. 概述
Jackson-jr 是一個輕量級的 Java JSON 處理庫,旨在為原始Jackson
庫提供更簡單、更小的替代方案。 Jackson-jr 佔用空間小,API 簡單易用,是休閒 JSON 讀寫場景的絕佳選擇。
在本指南中,我們將探討 Jackson-jr 的主要功能和用法,以及示例和最佳實踐。
2. 小傑克遜入門
Jackson-jr 提供了一種輕量級且高效的方法來處理 Java 應用程序中的 JSON 數據。它提供了一個簡單的 API 來處理 JSON 對象和數組,使解析、生成和操作 JSON 數據變得更加容易。
首先,我們必須將 Jackson-jr 庫包含在我們的項目中。我們可以通過將所需版本的 Jackson-jr依賴項添加到項目的構建配置文件中來實現此目的。
對於 Maven,我們可以將依賴項添加到pom.xml
文件中:
<dependency>
<groupId>com.fasterxml.jackson.jr</groupId>
<artifactId>jackson-jr-all</artifactId>
<version>2.15.2</version>
</dependency>
對於 Gradle,我們可以將依賴項添加到build.gradle
文件中:
implementation 'com.fasterxml.jackson.jr:jackson-jr-all:2.15.2'
3. 使用 JSON 對象
使用 Jackson-jr 的基礎對像是JSON o
對象。關於JSON
對象的一個非常重要且不要忘記的事實:每個JSON
實例都是完全不可變且線程安全的。我們可以隨心所欲地使用它們,一個Singleton
實例,一個Spring
Bean,甚至構造單個對象。我們可以在不同線程之間傳遞相同的實例,因為它是完全不可變的。
3.1.創建 JSON 對象和數組
創建 JSON 對象和數組:Jackson-jr 提供了一個方便的 API 用於創建 JSON 對象和數組。我們可以使用LinkedHashMap
等類來表示 JSON 對象, ArrayList
來表示 JSON 數組。
JSON 對像是LinkedHashMap
。我們可以使用LinkedHashMap.put()
方法輕鬆地向其添加屬性,並使用LinkedHashMap.get()
方法獲取屬性。
String json = JSON.std
.with(JSON.Feature.PRETTY_PRINT_OUTPUT)
.asString(new LinkedHashMap<String, Object>() {{
put("name", "John Doe");
put("age", 30);
put("email", "[email protected]");
}});
3.2.小傑克遜作曲家
Jackson-jr 的另一個不錯的功能是添加了Composer
接口,用於以類似Builder 的風格生成 JSON 內容:
String json = JSON.std.with(JSON.Feature.PRETTY_PRINT_OUTPUT)
.composeString()
.startObject()
.startArrayField("objectArray")
.startObject()
.put("name", "name1")
.put("age", 11)
.end()
.startObject()
.put("name", "name2")
.put("age", 12)
.end()
.end()
.startArrayField("array")
.add(1)
.add(2)
.add(3)
.end()
.startObjectField("object")
.put("name", "name3")
.put("age", 13)
.end()
.put("last", true)
.end()
.finish();
此構建器會生成以下 JSON:
{
"objectArray" : [ {
"name" : "name1",
"age" : 11
}, {
"name" : "name2",
"age" : 12
} ],
"array" : [ 1, 2, 3 ],
"object" : {
"name" : "name3",
"age" : 13
},
"last" : true
}
4. 序列化和反序列化
Jackson-jr 允許我們輕鬆地將 Java 對象轉換為 JSON 字符串,反之亦然。我們可以使用所需的選項配置編寫器,例如漂亮的打印或自定義日期格式,然後使用它將對象寫入 JSON 字符串。
Jackson-jr 支持複雜的對象結構,包括嵌套對象和數組。通過正確定義 Java 類的結構及其關係,Jackson-jr 可以處理複雜 JSON 數據的序列化和反序列化。
// Serialization
String json = JSON.std.with(JSON.Feature.PRETTY_PRINT_OUTPUT)
.asString(person);
// Deserialization
json = "{\"name\":\"John Doe\",\"age\":30}";
Person person1 = JSON.std.with(JSON.Feature.PRETTY_PRINT_OUTPUT)
.beanFrom(Person.class, json);
4.1.小傑克遜的定制
Jackson-jr 支持各種註釋,例如@JsonProperty
,以自定義序列化和反序列化過程。這些註釋允許我們控制屬性的名稱、指定日期和時間格式以及處理其他自定義場景。我們可以在他們的官方 Github 註釋項目中看到所有支持的註釋的列表。
Jackson-jr 有一個功能自定義列表,我們可以使用它來自定義序列化和反序列化的輸入和輸出,自定義如漂亮的打印、寫入 null 屬性等。查看所有這些的最簡單方法是在基礎中代碼。
JSON jsonMapper = JSON.std.with(JSON.Feature.PRETTY_PRINT_OUTPUT)
.with(JSON.Feature.WRITE_NULL_PROPERTIES)
.with(JSON.Feature.FAIL_ON_DUPLICATE_MAP_KEYS);
String json = jsonMapper.asString(person);
Jackson-jr 允許我們創建自定義序列化器和反序列化器來處理特定的數據類型或複雜的序列化場景。通過實現適當的接口ValueWriter
,
擴展提供的類ValueReader and
ReadWriterProvider
,我們可以定義自定義對象應如何序列化和反序列化。
Jackson-jr 不支持java.time.*
包,但我們可以使用自定義序列化器和反序列化器添加它:
public class CustomDateSerializer implements ValueWriter {
@Override
public void writeValue (JSONWriter jsonWriter, JsonGenerator jsonGenerator, Object o) throws IOException {
jsonGenerator.writeString(o.toString());
}
@Override
public Class<?> valueType () {
return LocalDate.class;
}
}
public class CustomDateDeserializer extends ValueReader {
private final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
public CustomDateDeserializer () {
super(LocalDate.class);
}
@Override
public Object read (JSONReader jsonReader, JsonParser jsonParser) throws IOException {
return LocalDate.parse(jsonParser.getText(), dtf);
}
}
註冊它們後,我們可以開始序列化和反序列化LocalDate
對象:
public class MyHandlerProvider extends ReaderWriterProvider {
@Override
public ValueWriter findValueWriter (JSONWriter writeContext, Class<?> type) {
if (type == LocalDate.class) {
return new CustomDateSerializer();
}
return null;
}
@Override
public ValueReader findValueReader (JSONReader readContext, Class<?> type) {
if (type.equals(LocalDate.class)) {
return new CustomDateDeserializer();
}
return null;
}
}
Person person = new Person("John Doe", 30, LocalDate.now());
JSON jsonMapper = JSON.builder().register(new JacksonJrExtension() {
@Override
protected void register (ExtensionContext extensionContext) {
extensionContext.insertProvider(new MyHandlerProvider());
}
}).build().with(JSON.Feature.PRETTY_PRINT_OUTPUT);
String json = jsonMapper.asString(person);
Person deserializedPerson = jsonMapper.beanFrom(Person.class, json);
5. 小傑克遜 vs 傑克遜
小傑克遜 | 傑克遜 |
小一點的罐子 | 更大的罐子 |
功能較少 | 更複雜的功能 |
更適合更簡單的序列化和反序列化 | 更適合更複雜的序列化和反序列化 |
更快的啟動時間 | 啟動時間較慢 |
更簡單的API | 更複雜的API |
六,結論
Jackson-jr 為 Java 應用程序中的 JSON 處理提供了一種輕量級且用戶友好的方法。憑藉其簡化的 API、定制選項和高效的性能,對於需要輕量級 JSON 處理庫而又不影響功能的開發人員來說,它是一個絕佳的選擇。
與往常一樣,示例的源代碼可在 GitHub 上獲取。