6. 二十不惑,ObjectMapper使用也不再迷惑(上)

简介: 6. 二十不惑,ObjectMapper使用也不再迷惑(上)

前言


各位好,我是YourBatman。从本文起,终于要和Jackson的“高级”部分打交道了,也就是数据绑定jackson-databind模块。通过接触它的高级API,你会持续的发现,前面花那么多篇幅讲的core核心部分是价值连城的。毕竟村上春树也告诉过我们:人生没有无用的经历嘛。


jackson-databind包含用于Jackson数据处理器的通用 数据绑定功能和树模型。它构建在Streaming API之上,并使用Jackson注解进行配置。它就是Jackson提供的高层API,是开发者使用得最多的方式,因此重要程度可见一斑。


虽然Jackson最初的用例是JSON数据绑定,但现在它也可以用于其它数据格式,只要存在解析器和生成器实现即可。但需要注意的是:类的命名在很多地方仍旧使用了“JSON”这个词(比如JsonGenerator),尽管它与JSON格式没有实际的硬依赖关系。


小贴士:底层流式API使用的I/O进行输入输出,因此理论上是支持任何格式的



image.png


版本约定


  • Jackson版本:2.11.0
  • Spring Framework版本:5.2.6.RELEASE
  • Spring Boot版本:2.3.0.RELEASE


本文开始,新增导包:


<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>


Tips:jackson-databind模块它强依赖于jackson-core和jackson-annotations,只需要导入此包,另外两个它自动会帮带进来。


这里需要说明几句:我们知道core包中还有个jackson-annotations,难道不讲了吗?其实不是,是因为单独讲jackson-annotations并无意义,毕竟注解还得靠数据绑定模块来解析,所以先搞定这个后再杀回去。


✍正文


据我了解,很多小伙伴对Jackson的了解起源于ObjectMapper,止于ObjectMapper。那行,作为接触它的第一篇文章咱们就轻松点,以应用为主来整体的认识它。


功能介绍


ObjectMapper是jackson-databind模块最为重要的一个类,它完成了coder对数据绑定的几乎所有功能。它是面向用户的高层API,底层依赖于Streaming API来实现读/写。ObjectMapper主要提供的功能点如下:


  • 它提供读取和写入JSON的功能(最重要的功能)
  • 普通POJO的序列化/反序列化
  • JSON树模型的读/写
  • 它可以被高度定制,以使用不同风格的JSON内容
  • 使用Feature进行定制
  • 使用可插拔com.fasterxml.jackson.databind.Module模块来扩展/丰富功能
  • 它还支持更高级的对象概念:比如多态泛型、对象标识
  • 它还充当了更为高级(更强大)的API:ObjectReader和ObjectWriter的工厂
  • ObjectReader和ObjectWriter底层亦是依赖于Streaming API实现读写


尽管绝大部分的读/写API都通过ObjectMapper暴露出去了,但有些功能函数还是只放在了ObjectReader/ObjectWriter里,比如对于读/写 长序列 的能力你只能通过ObjectReader#readValues(InputStream) / ObjectWriter#writeValues(OutputStream)去处理,这是设计者有意为之,毕竟这种case很少很少,没必要和常用的凑合在一起嘛。


数据绑定


数据绑定分为简单数据绑定和完全数据绑定:


  • 简单数据绑定:比如绑定int类型、List、Map等…
@Test
public void test1() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
  // 绑定简单类型  和 Map类型
    Integer age = objectMapper.readValue("1", int.class);
    Map map = objectMapper.readValue("{\"name\":  \"YourBatman\"}", Map.class);
    System.out.println(age);
    System.out.println(map);
}


运行程序,输出:

1
{name=YourBatman}



  • 完全数据绑定:绑定到任意的Java Bean对象…


准备一个POJO:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
}


绑定数据到POJO:

@Test
public void test2() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    Person person = objectMapper.readValue("{\"name\":  \"YourBatman\", \"age\": 18}", Person.class);
    System.out.println(person);
}


运行程序,输出:

Person(name=YourBatman, age=18)


ObjectMapper的使用


在应用及开发中,ObjectMapper绝对是最常使用的,也是你使用Jackson的入口,本文就列列它的那些使用场景。


小贴士:树模型会单独成文介绍,体现出它的重要性


写(序列化)


提供writeValue()系列方法用于写数据(可写任何类型),也就是我们常说的序列化。


image.png


  • writeValue(File resultFile, Object value):写到目标文件里
  • writeValue(OutputStream out, Object value):写到输出流
  • String writeValueAsString(Object value):写成字符串形式,此方法最为常用
  • writeValueAsBytes(Object value):写成字节数组byte[]

@Test
public void test3() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    System.out.println("----------写简单类型----------");
    System.out.println(objectMapper.writeValueAsString(18));
    System.out.println(objectMapper.writeValueAsString("YourBatman"));
    System.out.println("----------写集合类型----------");
    System.out.println(objectMapper.writeValueAsString(Arrays.asList(1, 2, 3)));
    System.out.println(objectMapper.writeValueAsString(new HashMap<String, String>() {{
        put("zhName", "A哥");
        put("enName", "YourBatman");
    }}));
    System.out.println("----------写POJO----------");
    System.out.println(objectMapper.writeValueAsString(new Person("A哥", 18)));
}


运行程序,输出:

----------写简单类型----------
18
"YourBatman"
----------写集合类型----------
[1,2,3]
{"zhName":"A哥","enName":"YourBatman"}
----------写POJO----------
{"name":"A哥","age":18}




相关文章
|
存储 算法 NoSQL
接口限流
防止用户恶意刷新接口, 防止对接口的恶意请求,减少不必要的资源浪费,从而保证服务可用。如果不做限流,任由某个用户以非正常方式高频率访问的话,会直接将网络流量、服务器资源挤占完,从而影响正常对外提供服务,造成服务不可用。
530 1
|
10月前
|
供应链 JavaScript 安全
B/S云门诊系统源码,java云诊所源码,基于Spring Boot、Vue.js构建
云端SaaS架构云门诊系统,基于Spring Boot+Vue开发,支持医保结算,集成预约挂号、诊疗、收费、库存、会员管理等功能,适用于各类基层医疗机构,可打包为C/S桌面应用,支持外接设备免安装配置。
367 10
|
存储 NoSQL 物联网
MongoDB应用场景
MongoDB应用场景
|
机器学习/深度学习 传感器 人工智能
AI与未来医疗:重塑健康管理新格局随着人工智能(AI)技术的飞速发展,医疗行业正迎来一场前所未有的变革。AI不仅在数据分析、诊断支持方面展现出巨大潜力,还在个性化治疗、远程医疗等多个领域实现了突破性进展。本文将探讨AI技术在医疗领域的具体应用及其对未来健康管理的影响。
人工智能(AI)正在彻底改变医疗行业的面貌。通过深度学习算法和大数据分析,AI能够迅速分析海量的医疗数据,提供精准的诊断和治疗建议。此外,AI在远程医疗、药物研发以及患者管理等方面也展现出了巨大的潜力。本文将详细探讨这些技术的应用实例,并展望其对健康管理的深远影响。
1245 28
|
机器学习/深度学习 算法 机器人
机器人控制中常见的算法总结
机器人控制中常见的算法总结
1381 0
|
SQL Java 数据安全/隐私保护
发现问题:Mybatis-plus的分页总数为0,分页功能失效,以及多租户插件的使用。
总的来说,使用 Mybatis-plus 确实可以极大地方便我们的开发,但也需要我们理解其工作原理,掌握如何合适地使用各种插件。分页插件和多租户插件是其中典型,它们的运用可以让我们的代码更为简洁、高效,理解和掌握好它们的用法对我们的开发过程有着极其重要的意义。
1152 15
|
机器学习/深度学习 分布式计算 并行计算
【MATLAB】史上最全的13种数据拟合算法全家桶
【MATLAB】史上最全的13种数据拟合算法全家桶
2968 1
|
机器学习/深度学习 安全 开发工具
通义灵码开发者社区的构成——通义灵码团队与合作伙伴
通义灵码开发者社区的成功,得益于核心团队的引领和合作伙伴的支持。团队专注于产品开发、维护及社区管理,确保通义灵码的高质量与稳定性;合作伙伴则提供丰富的资源和资金支持,共同推动技术创新和市场应用,构建了一个充满活力的生态系统。
|
机器学习/深度学习 人工智能 开发者
谷歌推世界首个AI游戏引擎,2000亿游戏产业恐颠覆!0代码生成游戏,老黄预言成真
【9月更文挑战第22天】谷歌近日推出的AI游戏引擎GameNGen,作为全球首款神经模型驱动的游戏引擎,引发了广泛关注。该引擎使用户无需编写代码即可生成游戏,并实现了与复杂环境的实时交互,显著提升了模拟质量。在单TPU上,GameNGen能以超20帧/秒的速度流畅模拟经典游戏《DOOM》。这项技术不仅简化了游戏开发流程,降低了成本,还为游戏设计带来了更多可能性。然而,它也可能改变游戏产业的商业模式和创意多样性。无论如何,GameNGen标志着游戏开发领域的一次重大革新。
579 2