在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例

使用Jackson API在Java中解析JSON时的常见问题之一是,当您的JSON包含未知属性(即您的Java类没有对应于所有JSON属性的所有字段)时,该操作将失败。 例如,如果您正在使用REST Web服务中的JSON,并且明天他们在JSON中添加了一个新字段,则您的代码将中断,因为Jackson将抛出UnrecognizedPropertyException并停止解析JSON。 这很麻烦,如果您不知道,可能会导致生产问题。 当开发人员交付代码以使用来自REST API的数据而未正确处理未知字段时,我遇到了这个问题。

该代码可以正常工作几个月,但是一旦源系统添加了一个新字段并添加到REST API中,它就崩溃了。 开发人员选择忽略更新,因为我们对该字段不感兴趣,但是他没有预见到它将影响JSON解析 。

无论如何,我们的错是我们没有正确地检查代码,并允许他在不处理未知文件的情况下将其代码发布到生产环境中。 如果他更熟悉Jackson图书馆,就可以避免这个问题。

Jackson API提供了两种忽略未知字段的方法 ,一种是在类级别使用@JsonIgnoreProperties批注,另一种是在ObjectMapper级别使用configure()方法。

您将在本文中看到这两种方法,并了解如何使用它们以及何时使用<@code> JsonIgnoreProperties以及何时在ObjectMapper级别全局忽略JSON中的未知字段。

使用@JsonIgnoreProperties忽略未知属性

如果要创建一个Model类来表示Java中的JSON,则可以使用@JsonIgnoreProperties (ignoreUnknown = true)对该类进行注释,以忽略任何未知字段。 这意味着,如果明天在JSON上添加一个代表您的模型的新字段,那么Jackson在用Java解析JSON时将不会抛出UnrecognizedPropertyException

如果只想忽略该Model类的未知属性,则可以使用此方法,但这是首选方法,因为它为您提供了更多控制权。

我们来看一个在Java中使用@JsonIgnoreProperties的示例:

假设我遵循以下JSON,它代表了我最喜欢的书《 Effective Java 3rd Edition》 ,一本必须为2018年每个Java开发人员阅读的书以及我项目中的Java模型类:

如果明天,我在JSON中添加一个名为“ edition”的新字段,则此JSON的解析将失败,并出现UnrecognizedPropertyException错误。 就像是 :

线程“ main”中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“ edition”(电子书类),未标记为可忽略(3个已知属性:,“ title”,“ price”,“ author”) )”

这意味着Jackson无法在EBook类中找到JSON中“ edition”属性的任何字段,因此会UnrecognizedPropertyException错误。

您可以使用@JsonIgnoreProperties批注来解决此问题并防止此错误,如下所示:

@JsonIgnoreProperties(ignoreUnknown = true)
class EBook{private String title;private String author;private int price; ..}

我们刚刚将整个模型类注释为@JsonIgnoreProperties (ignoreUnknown = true),这意味着JSON字符串中的任何未知属性,即在EBook类中没有对应字段的任何属性都将被忽略。 如果您再次编译并运行程序,它将可以正常工作。

在Jackson 2.x中, @JsonIgnoreProperties驻留在com.fasterxml.jackson.annotation包中,因此您需要将其导入为:

导入com.fasterxml.jackson.annotation.JsonIgnoreProperties。

如果您使用的是杰克逊API的旧版本,例如杰克逊1.x,则此注释属于不同的软件包,请当心,特别是如果您的类路径中同时包含杰克逊1.x和杰克逊2.x。

使用Jackson全局忽略JSON中的未知属性

处理您正在解析的JSON中的未知属性的另一种方法是将ObjectMapper配置为在遇到未知属性时不失败。 这还将解决UnrecognizedPropertyException的问题。 您可以通过调用configure()方法来启用此设置,如下所示:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

现在,它将忽略要解析的任何JSON的未知属性。仅当无法使用@JsonIgnoreProperties注释对类进行注释时,才应使用此选项。

顺便说一句,如果您不熟悉Java中的JSON解析库,那么从Udemy上使用Java API,jQuery和REST Web Services进行JSON是一个不错的起点。

使用Jackson解析JSON时忽略未知属性的Java程序

让我们看看到目前为止我们所学到的一切。 顺便说一句,如果您对我的String JSON和很多“ / r / n”字符串感到困惑,请不要担心。 我还没有手动完成。 我用这个
Eclipse复制我的JSON的技巧 ,它自动包含必要的转义字符。 这是必需的,因为JSON字符串用双引号(“”)引起来,需要在Java中对其进行转义。

顺便说一句,如果您不熟悉Eclipse IDE,那么我建议您查看Udemy上的“ 初学者Eclipse Java IDE培训课程 ”以学习它。 对于Java开发人员而言,重要的是要充分了解其工具,尤其是IDE,以便他们有效地开发,测试,调试和运行Java应用程序。

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;/** Java Program to iterate over JSONObject of json-simple*/
public class JacksonTest {private static String json = "{\r\n" + "\"title\" : \"Effective Java\",\r\n"+ "\"author\" : \"Joshua Bloch\",\r\n" + "\"price\" : 37,\r\n"+ "\"edition\" : 37\r\n" + "}";public static void main(String args[]) throws IOException {// let's parse JSON with a date fieldObjectMapper mapper = new ObjectMapper();// mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,// false);EBook effectiveJava = mapper.readValue(json, EBook.class);System.out.println("Input json string");System.out.println(json);System.out.println("Generated java class: ");System.out.println(effectiveJava);}}class EBook {private String title;private String author;private int price;public EBook() {// no argument constructor required by Jackson}public EBook(String title, String author, int price) {this.title = title;this.author = author;this.price = price;}public String getTitle() {return title;}public String getAuthor() {return author;}public int getPrice() {return price;}public void setTitle(String title) {this.title = title;}public void setAuthor(String author) {this.author = author;}public void setPrice(int price) {this.price = price;}@Overridepublic String toString() {return "EBook [title=" + title + ", author=" + author + ", price=" + price+ "]";}}Output:
Input json string
{
"title" : "Effective Java",
"author" : "Joshua Bloch",
"price" : 37,
"version" : 37
}
Generated java class: 
EBook [title=Effective Java, author=Joshua Bloch, price=37]

我有一个名为EBook的模型类,该类用@JsonIgnoreProperties (ignoreUnknown = true)注释,以忽略未知属性。

如果仔细观察,我们的JSON字符串包含Java类中未定义的“ edition”属性,但该程序可以运行,因为我们已使用@JsonIgnoreProperties (ignoreUnknown = true)标记了EBook。

如果要测试此程序,则只需删除该批注并运行该程序,它将引发以下错误。

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field"edition" (class EBook), not marked as ignorable (3 known properties: , "title", "price", "author"])
at [Source: java.io.StringReader@19dfb72a; line: 5, column: 14] (through reference chain: EBook["edition"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79)
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1160)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
at JacksonTest.main(JacksonTest.java:30)

发生这种情况是因为“版本”字段仅出现在JSON中,而没有出现在Java类中。 如果您放回注解,则代码将再次起作用。

您可以类似地在对象映射器级别测试如何忽略未知字段 ,而不用@JsonIgnoreProperties批注,而只需取消注释
代码中的mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false)行并运行程序。 这一次它也将起作用,因为杰克逊忽略了所有未知属性。

这就是在使用Jackson API在Java中解析JSON时如何忽略未知属性的全部内容。 您可以通过使用@JsonIgnoreProperties批注或通过禁用FAIL_ON_UNKNOWN_PROPERTIES来配置反序列化过程中遇到未知属性时ObjectMapper不会失败而做到这一点。

但是,首选方法是使用@JsonIgnoreProperties (ignoreUnknown = true)在类级别忽略未知属性,并且仅当无法使用此注释来注释类(即您不拥有该类)时才在ObjectMapper级别执行此操作。 最好的做法是使用@JsonIgnoreProperties注释模型类,以避免我在第一段中解释的问题。

您可能喜欢的其他Java和JSON资源

运行中的JSON:构建基于JSON的应用程序
如何使用Gson解析JSON?
Java开发人员应该知道的5个JSON解析库 如何在Java中解析JSON数组? 如何在Java中将JSON转换为HashMap? Java开发人员在2018年应该学习的10件事 带有Java API,jQuery和REST Web服务的JSON

感谢您到目前为止阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如果您有任何疑问或疑问,请留下笔记。

翻译自: https://www.javacodegeeks.com/2018/01/ignore-unknown-properties-parsing-json-java-jackson-jsonignoreproperties-annotation-example.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php界面设置编码格式,php设置编码格式的方法

php设置编码格式的方法发布时间&#xff1a;2020-08-15 11:02:56来源&#xff1a;亿速云阅读&#xff1a;78作者&#xff1a;小新这篇文章主要介绍php设置编码格式的方法&#xff0c;文中介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们一定要看完&…

单元测试 问题描述_单元测试技巧:创建描述性测试

单元测试 问题描述您的单元测试应尽可能具有描述性。 他们给您的反馈应该非常清楚&#xff0c;您甚至不必启动调试器&#xff0c;并一步一步地检查代码以检查局部变量。 为什么&#xff1f; 因为那需要时间&#xff0c;而且我们很懒&#xff0c;对吗&#xff1f; 为此&#xff…

matlab小波脊线,小波脊线提取,模极大值法。运行的结果不太对,代码有些地方我也没完全看懂...

本帖最后由 1393107100 于 2019-5-1 11:10 编辑clear,clcclose all%%%%%% 小波变换 %%%%%%%%%%%%%%%%fs1024;t1/fs:1/fs:1;f1100;f2200;f3300;scos(2*pi*f1*t.*(t>0&t<0.3))2*cos(2*pi*f2*t.*(t>0.3&t<0.8))3*sin(2*pi*f3*t.*(t>0.8&t<1));%sc…

php json追加500错误,在composer.json中添加了一个git地址;composer update 报错

在composer.json中添加了一个git地址&#xff1b;composer update 报错&#xff0c;不知道是什么原因导致的&#xff0c;如图&#xff1a;问题补充&#xff1a;在BAE包里面添加composer.json 后 重新composer updateYour requirements could not be resolved to an installable…

matlab曲线拟合 最低点,Matlab曲线拟合 最小二乘法 polyfit【转】

曲线拟合已知离散点上的数据集 &#xff0c;即已知在点集 上的函数值 &#xff0c;构造一个解析函数(其图形为一曲线)使 在原离散点 上尽可能接近给定的值&#xff0c;这一过程称为曲线拟合。最常用的曲线拟合方法是最小二乘法&#xff0c;该方法是寻找函数 使得 最小。MATLAB函…

sin查找表 matlab,利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

1.使用matlab制作.coe文件查找表的构造构造256点的正余弦表exp(-j*2*pi*(0:255)/256)&#xff0c;分别得到 cos和sin的查找表matlab代码: 求sinfid fopen(sin.txt,a );str1 MEMORY_INITIALIZATION_RADIX10;;str2 MEMORY_INITIALIZATION_VECTOR;fprintf(fid,\t%s\n \t%s\n, s…

php提取pdf首页图片,pdf图片怎么提取

pdf图片的提取方法&#xff1a;首先用极速PDF阅读器打开文档&#xff1b;然后在图片处单击鼠标右键并选择“复制图片”&#xff0c;这时就可以粘贴发送了。本文操作环境&#xff1a;Windows7系统&#xff0c;Microsoft Office PowerPoint2020版本&#xff0c;Dell G3电脑。pdf图…

dlopen linux 实例_Linux静态库和动态库

库从本质上来说是一种可执行代码的二进制格式&#xff0c;可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a&#xff1b;利用静态函数库编译成的文件比较大&#xff0c;因为整个 函数库的所有数据都会被整合进目标…

反射setaccessible_advancedday16类加载器,反射

加载配置文件在src目录下创建一个config.properties配置文件&#xff0c;使用类加载器加载配置文件。//创建集合Properties propertiesnew Properties();//获取src目录下&#xff0c;配置文件的流InputStream in ClassLoader.getSystemClassLoader() .getResourceAsStream(…

基于matlab的语音信号,科学网—[转载]【信息技术】【2014.06】【含源码】基于MATLAB的语音信号处理与分析 - 刘春静的博文...

本文为瑞典耶夫勒大学(作者&#xff1a;Nan Wu)的学士论文&#xff0c;共48页。语音传递是人类最重要、最有效、最常用的信息交流方式。语言是人类特有的特征&#xff0c;而人声是常用的工具&#xff0c;也是相互传递信息的重要途径。语音具有较大的信息容量。因此&#xff0c;…

string.intern_使用String.intern()减少内存使用

string.intern时不时地会有一个垂死的生产应用程序。 而且您知道您需要尽快对其进行修补。 我们也是如此&#xff0c;并认为分享最近的一个战争故事会很有趣。 在这种情况下&#xff0c;我们就有机会使用String.intern&#xff08;&#xff09;之类的简单补丁来修补应用程序。 …

微信批量退款php,微信支付退款接口详解

微信支付有2个退款相关的接口&#xff0c;分别是申请退款API和查询退款API&#xff0c;这2个接口在实际微信支付开发中都会用到。其中申请退款API因为安全性&#xff0c;需要使用证书&#xff0c;证书在商户平台后台下载.申请退款接口支持一年以内的订单退款&#xff0c;可以分…

1235813找规律第100个数_人教版一年级下册数学第1-8单元知识点梳理填空,附答案...

参考答案&#xff1a;第一单元 认识图形1、认识平面图形 2、平面图形的拼组用相同的正方形、长方形或三角形可以分别拼成更大的正方形、长方形或三角形。3、认识七巧板 七巧板是由1个正方形、1个平行四边形、5个三角形组成的。第二单元 20以内的退位减法1、十几减几的计算方法(…

pandas整表写入excel指定位置_当Python遇到Excel,一个能打的都没有~

几乎人人都在用Excel&#xff0c;这种极易上手的数据分析工具无处不在&#xff0c;一旦你掌握了窍门&#xff0c;它就变得非常强大。而Python通常被认为更具有挑战性&#xff0c;但能做的事也更多。当Python遇到Excel会发生什么&#xff1f;本文将告诉你&#xff0c;这三项Exce…

无需再忙了:Lambda-S3缩略图,由SLAppForge Sigma钉牢!

如果你还没有注意到了&#xff0c;我最近被唠叨试图开始使用时&#xff0c;我遭遇了陷阱AWSλ-S3正式例子 。 虽然大多数这些愚蠢的错误的指责是对我自己的懒惰&#xff0c;过度自尊和缺乏对细节的关注&#xff0c;我个人觉得&#xff0c;在开始与一家领先的无服务器供应商不应…

sqlyog设置自动补全_Visual Studio Code 最好的功能、插件和设置

Visual Studio Code 是由 Microsoft(微软) 发布的一个免费的&#xff0c;开源的跨平台文本编辑器。他们基于在线编辑 Visual Studio Online (代号为 “Monaco”)&#xff0c;并结合 GitHub 的 Electron 实现的一个跨平台编辑器。他们在为程序员创建一个快速且高效工作环境方面取…

ejb 示例 2018_Java EE EJB拦截器教程和示例

ejb 示例 2018在此示例中&#xff0c;我们将看到如何在EJB中使用拦截器并使用简单的Web应用程序对其进行测试。 1.简介 顾名思义&#xff0c;当您想拦截对EJB方法的调用时&#xff0c;将使用拦截器。 如果为Bean声明一个拦截器&#xff0c;则每次调用该Bean的方法时&#xff0…

linux怎么使用串口线,如何在Linux下使用USB转串口线,鼎力告诉您

亲爱的朋友&#xff0c;如果您使用的Linux的系统&#xff0c;应该怎么来使用我们的鼎力的USB转串口线呢&#xff1f;下面就来告诉您吧&#xff01;用Linux&#xff0c;不需要另外安装USB转串口驱动!前提是你要先安装minicom输入命令&#xff1a;dmesg| grep usb&#xff0c;看到…

comsol分析时总位移代表什么_超弹性材料模型的压缩分析

为了表征超弹性材料&#xff0c;需要进行各种测试获取实验数据&#xff0c;包括承受单轴拉伸和压缩、双轴拉伸和压缩以及扭转测试。今天&#xff0c;我们向大家介绍如何使用通过单轴和双轴测试获得的拉伸和压缩测试数据&#xff0c;模拟由弹性泡沫材料制成的球体的压缩。通过案…

由对称性知定点一定在x轴上_线上优秀教学案例(九)|计算机科学与工程学院刘钊:“延期不延教”之“1+X课堂”...

【编者按】受新冠肺炎疫情影响&#xff0c;按照教育部和河北省教育厅统一部署&#xff0c;学校延迟春季开学时间。为最大程度减少疫情和延期开学对我校教育教学工作的影响&#xff0c;本学期&#xff0c;我校以线上教学的形式拉开序幕。面对新的教学模式&#xff0c;各学院、广…