Java Jackson-jr 库使用介绍

2024-05-05 22:44
文章标签 java 使用 介绍 jackson jr

本文主要是介绍Java Jackson-jr 库使用介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API,Jackson-jr 的启动速度更快,包大小更小。

虽然Jackson databind(如ObjectMapper)是通用数据绑定的良好选择,但它的占用空间(Jar包大小)和启动开销在某些领域可能存在问题:比如移动端,特别是对于轻量使用(读或写)。这种情况下,完整的Jackson API是让人接受不了的。

由于所有这些原因,Jackson 官方决定创建一个更简单、更小的库:Jackson-jr。它仍旧构建在 Streaming API 之上,但不依赖于 databind 和annotation。因此,它的大小(jar和运行时内存使用)要小得多,它的API非常紧凑,所以适合APP等移动端。

它仅仅只依赖了 jackson-core 模块,所以体积上控制得非常的好。Jackson 单单三大核心模块大小合计1700KB左右(320 + 70 + 1370)。而Jackson-jr的体积控制在了95KB(就算加上core模块的320也不到500KB)。

针对实际开发的情况,很多时候我们只需要对 JSON 数据进行读取和写入,至于一些过于复杂和强大的属性,我们可能也用不上,因此针对一些 JSON 数据使用场景比较单一的情况,Jackson-jr 就显得更有优势了。

所以,Jackson-jr 的主要情况就是在针对 JSON 格式的读写上面,如果你只需要简单的读和些,Jackson-jr 通常是你的一个选择。

在本文中,我们对 Jackson-jr 的简单使用进行一些说明和示例。

开始使用 Jackson-jr

Jackson-jr 提供的是轻量和高效的 JSON 处理模块。所以 Jackson-jr 针对 JSON 数据结构只提供了简单的数据读取和写入功能。

当然 Jackson-jr 是可以处理对象和数组的。

在开始使用 Jackson-jr 之前,我们需要把需要的包添加到 Maven 项目的 pom 文件中。

当前的可以使用的最新版本为:2.17.0

<dependency><groupId>com.fasterxml.jackson.jr</groupId><artifactId>jackson-jr-all</artifactId><version>2.17.0</version>
</dependency>

XML

针对 Gradle 可以使用不同的表达方式,唯一需要注意一点的就是版本号。

处理 JSON 对象

尽管我们是使用 Jackson-jr 来处理 JSON 字符串,和 Jackson 一样,字符串也会被处理成为 JSON 对象:每一个 JSON 实例是不可变(immutable )的,同时也是线程安全的。

正是因为有上面的特性,我们可以在多线程程序,单例模式,Spring Bean 中安全的使用创建的 JSON 对象。

创建 JSON 对象和数组

针对创建的 JSON 对象,我们可以使用类似 LinkedHashMap 来创建对象,对于数组,我们就可以用我们常用的 ArrayList。

因为 JSON 对象使用的是 LinkedHashMap,所以我们可以利用 Map 的特性,使用  LinkedHashMap.put() 方法来 Push 数据到 Map 中。

    @Testpublic void createJsonStringTest() throws IOException {System.out.println(JSON.std.with(JSON.Feature.PRETTY_PRINT_OUTPUT).asString(new LinkedHashMap<String, Object>() {{put("name", "John Doe");put("age", 30);}}));}

Java

Jackson-jr Composer

Jackson-jr 同时还提供了 Composer 的这个创建方法,这个创建方法更加直接。

你可以按照你的想法直接进行定义和输出,在这之前,我们通常需要定义一个对象,然后对对象进行完成数据后再输出,对于一些简单的 JSON 格式。我们可以不用定义对象了,而是直接使用。

    public static String jsonComposer() throws IOException {return 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();}

Java

运行上面的程序后,程序将会输出:

{"objectArray" : [ {"name" : "name1","age" : 11}, {"name" : "name2","age" : 12} ],"array" : [ 1, 2, 3 ],"object" : {"name" : "name3","age" : 13},"last" : true
}

Plain text

序列化和反序列化

Jackson-jr 可以让我们非常容易的把 Java 对象进行序列化,同时也能够非常容易的让我们从 JSON 字符串中读取为 Java 对象。

在对对象进行读写的时候,我们也可以对读写的属性进行定义,例如对输出的文本进行格式化或者使用自定义的日期属性进行输出,然后再从 Java 对象中写入到 String 字符串。

Jackson-jr 同时也能够支持复杂的数据结构,例如对象嵌套和数组等。通过对我们对象的关联关系的定义,我们可以让 JSON 字符串在进行反序列化序列化的时候完成对象映射,对于 Java 到 String 字符串的输出,其实也是一样。

// 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);

Java

Jackson-jr 自定义选项

Jackson-jr 同时也支持大部分的注解(annotations)例如: @JsonProperty 这个和你日常使用的 Jackson 处理包是一样的。

你可以通过对对象注解的定义来控制序列化和反序列化的过程和数据。

对于可以支持的注解,可以范围 Jackson-jr 官方 GitHub 页面中有关的说明,这里我们就不一一列出,如果你用的是 Jackson 来处理序列化和反序列化的话,通常这些常用的注解应该还是比较熟悉的。

对于我们使用的序列化和反序列化输出来说,我们可以自定义输出,空对象如何输出等情况,这个和 Jackson 使用的方法是一致的。

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);

Java

Jackson-jr 也允许我们创建自定义的序列化和反序列化来处理特定的数据类型和复杂的序列化方法。

通过对接口的实现, ValueWriter 和提供的继承的类, ValueReader 和 ReadWriterProvider,我们可以自定义和序列化和反序列化的方式。

Jackson-jr 现在还不能支持  java.time.*,但是我们还是可以添加自定义的序列化和反序列化,如下面我们使用的代码:

public class CustomDateSerializer implements ValueWriter {@Overridepublic void writeValue (JSONWriter jsonWriter, JsonGenerator jsonGenerator, Object o) throws IOException {jsonGenerator.writeString(o.toString());}@Overridepublic Class<?> valueType () {return LocalDate.class;}
}

Java

public class CustomDateDeserializer extends ValueReader {private final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MMM-dd");public CustomDateDeserializer () {super(LocalDate.class);}@Overridepublic Object read (JSONReader jsonReader, JsonParser jsonParser) throws IOException {return LocalDate.parse(jsonParser.getText(), dtf);}
}

Java

当我们把我们自定义的代码注册到 JSON 处理对象后,我们就可以使用了 LocalDate 对象。

public class MyHandlerProvider extends ReaderWriterProvider {@Overridepublic ValueWriter findValueWriter (JSONWriter writeContext, Class<?> type) {if (type == LocalDate.class) {return new CustomDateSerializer();}return null;}@Overridepublic ValueReader findValueReader (JSONReader readContext, Class<?> type) {if (type.equals(LocalDate.class)) {return new CustomDateDeserializer();}return null;}
}

Java

上面和下面的这些代码显示了如何我们如何使用自定义的序列化和反序列化方法。

Person person = new Person("John Doe", 30, LocalDate.now());JSON jsonMapper = JSON.builder().register(new JacksonJrExtension() {@Overrideprotected 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);

Java

Jackson-jr 对比 Jackson

关于Jackson-jr 对比 Jackson 的内容,有人在做了一张下面的图。

简单点来说就 Jackson-jr 是Jackson 的轻量级应用,因为我们在很多时候都用不到 Jackson 的很多复杂功能。

对很多应用来说,我们可能只需要使用简单的 JSON 读写即可。

如我们用不到什么复杂的功能,并且使用了 Jackson-jr 能够满足你的项目使用的话,就直接使用 Jackson-jr 即可。

如发现 Jackson-jr 没有办法满足你的所有需求的时候,可以再切换到传统的 Jackson 包。

结论

Jackson-jr 提供了相对 Jackson 来说更加轻量的 JSON 数据处理模块。

对于很多只需要简单读写功能的 JSON 应用来说,就可以直接进行使用,对于服务器的应用,可能这个功能的削减对你的影响不大。

对大部分程序员来说,只需要了解 Jackson-jr 提供了一个轻量的兼容 JSON 大部分功能的解决方案即可。


Java Jackson-jr 库使用介绍 - Java - iSharkFly

这篇关于Java Jackson-jr 库使用介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962859

相关文章

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的