杰克逊前

通过。开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程

1.概述

本教程的重点是了解Jacksonobjectmap类以及如何将Java对象序列化为JSON并将JSON String DESERIALIZE TO java对象。

一般来说,了解更多关于杰克逊图书馆的信金宝搏官网188be息杰克逊教程是一个很好的开始。

进一步阅读:

与杰克逊遗产

本教程将演示如何处理包含子类型元数据和忽略继承自Jackson超类的属性。

杰克逊JSON的观点

如何使用jackson中的@jsonview注释完全控制对象的序列化(没有和春天)。

杰克逊 - 自定义串行器

使用自定义串行程序使用jackson 2控制您的JSON输出。

2.依赖关系

让我们首先将以下依赖添加到pom.xml:

<依赖> < groupId > com.fasterxml.jackson。jackson-databind 2.11.1 

这个依赖也会传递地将以下库添加到类路径中:

  1. jackson-annotations
  2. jackson-core

始终使用Maven Central存储库的最新版本jackson-databind

3.阅读和写作objectmap

让我们从基本的读写操作开始。

简单readValueAPI的objectmap是一个很好的切入点。我们可以使用它来将JSON内容解析或反序列化为Java对象。

另外,在写作方面,我们可以使用writevalue.将任何Java对象序列化为JSON输出。

我们将使用以下内容具有两个字段的类作为对象,以序列化或在本文中序列化或反序列化:

公共班车{私有字符串颜色;私有字符串类型;//标准的getter和setter}

3.1。Java对象json

方法将Java对象序列化为JSON的第一个示例writevalue.方法的方法objectmap类:

objectapper objectapper = new objectapper ();汽车车=新车(“黄色”,“雷诺”);ObjectMapper.WriteValue(新文件(“Target / Car.Json”),汽车);

上述文件的输出将是:

{“颜色”:“黄色”,“类型”:“renault”}

的方法writeValueAsStringwriteValueAsBytesobjectmap类从Java对象生成JSON,并以字符串或字节数组的形式返回生成的JSON:

字符串Carasstring = ObjectMapper.WriteValueAstring(汽车);

3.2。JSON到Java对象

下面是使用使用的JAVA对象将JSON字符串转换为JAVA对象的简单示例objectmap类:

json字符串= "{\颜色\”:\“黑\”,\“\”,\“宝马\“}”;Car = objectapper。readValue(json, Car.class);

readValue ()函数也接受其他形式的输入,例如包含json字符串的文件:

Car = objectapper。readValue(new File("src/test/resources/json_car.json"), Car.class);

或一个网址:

Car = objectapper。readValue(new URL("file:src/test/resources/json_car.json"), Car.class);

3.3。杰森到杰克逊jsonnode.

另外,一个JSON可以被解析成jsonnode.对象并用于从特定节点检索数据:

字符串json =“{\”颜色\“:\”black \“,\”type \“:\”fiat \“}”;jsonnode jsonnode = objectmapper.readtree(JSON);字符串颜色= jsonnode.get(“颜色”)。astext();//输出:颜色 - >黑色

3.4。从JSON数组字符串创建Java列表

我们可以使用数组的形式解析JSON进入Java对象列表TypeReference:

字符串jsonCarArray = "[{\颜色\”:\“黑\”,\“\”,\“宝马 \" }, { \" “红色\颜色\”:\”,\“类型\ ":\ "菲亚特\“}”;列表 listcar = objectmapper.readvalue(jsoncararray,new typeReference >(){});

3.5。从JSON字符串创建Java Map

同样,我们可以将JSON解析为Java地图:

json字符串= "{\颜色\”:\“黑\”,\“\”,\“宝马\“}”;地图<字符串,对象>地图= ObjectMapper.readValue(JSON,New TypeReference >(){});

4.先进的功能

Jackson库最大的优点之一是高度自定义的序列化和反序列化过程。

在本节中,我们将通过一些高级功能,其中输入或输出JSON响应可以与生成或消耗响应的对象不同。

4.1。配置序列化或反序列化功能

在将JSON对象转换为Java类时,如果JSON字符串有一些新字段,则默认进程将导致异常:

字符串jsonstring =“{\”颜色\“:\”black \“,\”type \“:\”fiat \“,\”年“:\”1970 \“}”;

的Java对象的默认解析过程中,上面示例中的JSON字符串类车会导致UnrecognizedPropertyException例外。

通过配置方法时,我们可以扩展默认流程以忽略新字段:

objectMapper.configure (DeserializationFeature。FAIL_ON_UNKNOWN_PROPERTIES、假);Car = objectapper。readValue(jsonString, Car.class); JsonNode jsonNodeRoot = objectMapper.readTree(jsonString); JsonNode jsonNodeYear = jsonNodeRoot.get("year"); String year = jsonNodeYear.asText();

另一种选择是基于FAIL_ON_NULL_FOR_PRIMITIVES,它定义是否空值允许使用原始值的值:

ObjectMapper.Configure(DeserializationFeature.Fail_On_null_for_primitives,false);

相似地,FAIL_ON_NUMBERS_FOR_ENUM控制enum值是否允许序列化/反序列化为数字:

ObjectMapper.Configure(DeserializationFeature.Fail_On_Numbers_For_enums,False);

您可以找到序列化和反序列化功能的全面列表官方网站

4.2。创建自定义序列化器或Deserializer

另一个基本特征objectmap班级是注册自定义的能力序列化器Deserializer

自定义erializers和deserializers在输入或输出JSON响应的结构中的情况非常有用,而不是它必须序列化或次序列化的Java类。

以下是自定义JSON序列化器的示例:

public class CustomCarSerializer extends StdSerializer {public CustomCarSerializer() {this(null);} public CustomCarSerializer(Class t) {super(t);} public void serialize(Car Car, JsonGenerator JsonGenerator, SerializerProvider serializer) {JsonGenerator . writestartobject ();jsonGenerator。writeStringField(“car_brand car.getType ());jsonGenerator.writeEndObject ();}}

这个自定义序列化器可以这样调用:

objectMapper映射器= new objectMapper();SimpleModule模块=新的SimpleModule(“CustomCarserializer”,新版本(1,0,0,null,null,null));module.addserializer(car.class,new customcarserializer());Mapper.registerermodule(模块);汽车车=新车(“黄色”,“雷诺”);字符串carjson = mapper.writevalueastring(汽车);

这是什么看起来像(JSON输出)在客户端:

var carJson = {"car_brand":"renault"}

这是一个例子自定义JSON Deserializer:

公共类CustomCardEserializer扩展了StdDeserializer  {Public CustomCardeserializer(){this(null);公共CustomCardEserializer(类<?> vc){super(vc);@Override公共汽车Deserialize(JSONParser Parser,DeserializationContext Deserializer){Car Car = New Car();ObjectCodec Codec = Parser.getCodec();jsonnode node = codec.readtree(解析器);//尝试捕获块jsonnode colornode = node.get(“color”);字符串颜色= colornode.astext();car.setcolor(颜色);回车;}}

可以以这种方式调用此自定义Deserializer:

json字符串= "{\颜色\”:\“黑\”,\“\”,\“宝马\“}”;objectMapper映射器= new objectMapper();SimpleModule模块=新的SimpleModule(“CustomCardEserializer”,新版本(1,0,0,null,null,null);module.addeserializer(car.class,new customcardeserializer());Mapper.registerermodule(模块);汽车车= Mapper.Readvalue(JSON,CAR.CLASS);

4.3。处理日期的格式

的默认序列化java.util.Date生成数字,即,单时的时间戳(自1970年1月1日以来的毫秒数,UTC)。但这不是非常人性可读性,并且需要进一步转换以以人类可读的格式显示。

让我们包装实例,我们到目前为止使用的要求班上购买日期财产:

public class Request {private Car Car;私人datePurchased日期;//标准的getter和setter}

控制日期的字符串格式,并将其设置为,例如:yyyy-MM-dd HH:mm a z,请考虑以下代码片段:

objectapper objectapper = new objectapper ();dateformat df = new simpleDateFormat(“Yyyy-mm-dd hh:mm a z”);ObjectMapper.setDateFormat(DF);字符串carasstring = objectMapper.WriteValueAstring(请求);//输出:{“car”:{“颜色”:“黄色”,“类型”:“renault”},“datepurchased”:“2016-07-03 11:43 AM Cest”}

了解有关与杰克逊序列化日期的金宝搏官网188be更多信息,请阅读我们更深入的写作

4.4。处理收藏品

另一个小但有用的特性可以通过DeserializationFeature类能够从JSON数组响应中生成我们想要的集合类型。

例如,我们可以将结果作为数组生成:

字符串jsonCarArray = "[{\颜色\”:\“黑\”,\“\”,\“宝马 \" }, { \" “红色\颜色\”:\”,\“类型\ ":\ "菲亚特\“}”;objectapper objectapper = new objectapper ();ObjectMapper.Configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY,TRUE);Car [] Cars = ObjectMapper.ReadValue(JsonCararray,Car []。类);/ /打印汽车

或作为一个列表:

字符串jsonCarArray = "[{\颜色\”:\“黑\”,\“\”,\“宝马 \" }, { \" “红色\颜色\”:\”,\“类型\ ":\ "菲亚特\“}”;objectapper objectapper = new objectapper ();列表 listcar = objectmapper.readvalue(jsoncararray,new typeReference >(){});/ /打印汽车

更多关于处理与杰克逊集合的信息是可金宝搏官网188be用的这里

结论

Jackson是一个可靠而成熟的用于Java的JSON序列化/反序列化库。的objectmapAPI提供了一种非常灵活的简单方法来解析和生成JSON响应对象。本文讨论了使这个库如此流行的主要特性。

可以找到本文附带的源代码在GitHub。

杰克逊底部

通过。开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程
评论在本文上关闭!