杰克逊顶部

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

>>查看课程

1.概述

在本文中,我们将通过杰克逊2.x来看看未分组的过程 - 特别是在如何处理具有未知属性的JSON内容

如果你想深入挖掘并学习你可以用杰克逊 - 马头来做的其他很酷的事情主要的杰克逊教程

进一步阅读:

杰克逊詹森教程

在外面学习杰克逊2 - 编组和解马语从基本映射到先进技术和例外。

杰克逊忽略了编组上的物业

控制您的JSON输出 - 直接忽略某些字段,按名称或乘杰克逊幸福的类型(带有Mixins)。

杰克逊 - 改变字段名称

杰克逊 - 更改字段的名称,以遵守特定的JSON格式。

2.用其他/未知的字段解释JSON

JSON输入有各种形状和大小 - 以及大多数情况下,我们需要将其映射到预定义的Java对象,其中包含一定数量的字段。目标是简单忽略无法映射到现有Java字段的任何JSON属性

例如,假设我们需要解离JSON到以下Java实体:

公共类MyDto {私有字符串StringValue;私人INT INTVALUE;私人布尔布尔值;//标准构造函数,getters和setter}

2.1。UnrecognizedPropertyException.在未知的领域

尝试将具有未知属性的json对此简单的Java实体有未知的属性将导致一个com.fasterxml.jackson.databind.exc.unrecognizedPropertyException.

@test(预期= unrecognizedPropertyException.class)public void gensonhasunknownvalues_whendeserialization_thenexception()抛出jsonparseexception,jsonmappeException,ioException {string jsonasstring =“{stringValue”:“a”,“+”“Intvalue”:1,“+”“booleanvalue”:真,“+”“stringvalue2”:“某事”}“;objectMapper映射器= new objectMapper();MyDto ReadValue = Mapper.ReadValue(Jsonasstring,MyDto.class);assertnotnull(ReadValue);}

这将失败以下异常:

com.fasterxml.jackson.databind.exc.unrecognizedPropertyException:未被识别的字段“stringValue2”(class org.baeldung.jacks金宝搏188体育on.ignore.mydto),没有标记为无知(3个已知属性:“stringValue”,“booleanvalue”,“intvalue”])

2.2。处理使用的未知字段ObjectMapper.

我们现在可以配置完整ObjectMapper.要忽略JSON中的未知属性:

new objectmapper().configure(deserializationfeature.fail_on_unknown_properties,false)

然后我们应该能够将这种JSON读入预定义的Java实体:

@test public void getjsonhasunknownvaluesbutjacksonisignorizeunkns_whendeserializing_thencorrect()抛出jsonparseexception,jsonmappedexception,ioExceptionexception,ioExceptionexception =“{stringValue”:“a”,“+”“Intvalue”:1,“+”booleanvalue“:true,”+“stringvalue2“:“某物”}”;objectMapper映射器= new objectmapper().configure(deserializationfeature.fail_on_unknown_properties,false);MyDto ReadValue = Mapper.ReadValue(Jsonasstring,MyDto.class);assertnotnull(ReadValue);asserthat(ReadValue.getStringValue(),等于(“A”));assertthat(ReadValue.isbooleanValue(),等于(真实));assertthat(ReadValue.getIntValue(),等于(1));}

2.3。在课程级别处理未知字段

我们还可以标记一个单级,接受未知字段,而不是整个杰克逊ObjectMapper.

@jsonignoreproperties(ignoreunknown = true)public类mydtoignoreunknown {...}

现在,我们应该能够测试与之前的相同行为 - 只忽略未知字段,只映射已知字段:

@test public void给jsonhasunknownvaluesbutignoredonclass_whendeserializing_thencorrect()抛出jsonparseexception,jsonmappedException,ioExceptionexception,ioException {String jsonasstring =“{stringValue”:“a”,“+”“Intvalue”:1,“+”“booleanvalue”:true,“+”StringValue2“:“某物”}”;objectMapper映射器= new objectMapper();mydtoignoreunknown readvalue = mapper .readvalue(jsonasstring,mydtoignoreunknown.class);assertnotnull(ReadValue);asserthat(ReadValue.getStringValue(),等于(“A”));assertthat(ReadValue.isbooleanValue(),等于(真实));assertthat(ReadValue.getIntValue(),等于(1));}

3. Unmarshall一个不完整的JSON

同样地与其他未知字段,解马语不完整的JSON - 一个不包含Java类中所有字段的JSON - 这不是杰克逊的问题:

@test public void gendnotallfieldshavevaluesinjson_whendeserializingajsontoaclass_thencorrect()抛出jsonparseexception,jsonmappeException,ioException {string jsonasstring =“{”stringValue“:”a“,”booleanvalue“:true}”;objectMapper映射器= new objectMapper();MyDto ReadValue = Mapper.ReadValue(Jsonasstring,MyDto.class);assertnotnull(ReadValue);asserthat(ReadValue.getStringValue(),等于(“A”));assertthat(ReadValue.isbooleanValue(),等于(真实));}

4。结论

本文使用jackson涵盖了使用额外的未知属性的JSON来指定json。

这是在与杰克逊一起使用时配置的最常见的事情之一,因为我们需要的情况将外部REST API的JSON结果映射到内部Java表示API的实体。

可以找到所有这些示例和代码片段的实现我的github项目

杰克逊底部

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

>>查看课程
6.注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!