在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;感兴趣的小伙伴们一定要看完&…

php文件显示不完整,github文件显示不全

github仓库里面有的文件显示不全&#xff0c;具体看这里&#xff0c;在编辑文件时就能看到全部内容看了stackoverflow上类似的问题&#xff1a;Full file not displaying on GitHub?&#xff0c;然后又看了Dealing with line endings&#xff0c;还是没有解决。望解答&#xf…

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

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

java ftp获取文件夹大小,java 用FTPClient 下载文件时不显示总大小?解决方案

java 用FTPClient 下载文件时不显示总大小&#xff1f;FTPClient ftp new FTPClient();ftp.setControlEncoding("utf-8");OutputStream outputStream null;try {int reply;// 连接FTP服务器// 如果采用默认端口&#xff0c;可以使用ftp.connect(url)的方式直接连接…

php中数组生成下拉选项,php利用数组填充下拉列表框

这篇文章主要介绍了php使用数组填充下拉列表框的方法,涉及php操作数组的技巧,具有一定参考借鉴价值,需要的朋友可以参考下本文实例讲述了php使用数组填充下拉列表框的方法。具体实现方法如下&#xff1a;<?php $data array((object)array("titulo">"For…

同时使用传入和传出连接时,相互TLS身份验证存在Java问题

在大多数企业环境中&#xff0c;在应用程序之间的连接中使用某种形式的安全通信&#xff08;例如TLS或SSL&#xff09;。 在某些环境中&#xff0c; 相互&#xff08;双向&#xff09;身份验证也是一项非功能性要求。 有时将其称为双向SSL或双向TLS身份验证。 因此&#xff0c;…

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…

java 解析gson_使用Java和Google GSON解析ESPN API

java 解析gson在我的第一篇文章中&#xff0c;我将解释如何解析ESPN API。 可以在http://developer.espn.com/docs上找到API文档。 首先&#xff0c;您需要请求一个API密钥&#xff0c;然后您可以开始查询REST API以检索JSON响应。 在下面的示例中&#xff0c;我将简单查询在英…

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

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

多元统计分析matlab,MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法...

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a;1.层次聚类hierarchical clustering2.k-means聚类这里用最简单的实例说明以下层次聚类原理和应用发法。层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、cluster等…

如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 &#xff08;一个开放源代码日志记录库&#xff09;&#xff0c;但无法找到所需的JAR文件&#xff0c;例如slf4j-api-1.7.2.jar因此它是在线程“ main” java.lang.NoClassDefFoundError&#xff1a; org/s…

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…

lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索

lucene使用3.0.3Lucene是用Java编写的全文搜索引擎&#xff0c;可以为任何应用程序提供强大的搜索功能。 Lucene的核心是基于文件的全文本索引。 Lucene提供API创建该索引&#xff0c;然后向该索引添加和删除内容。 此外&#xff0c;它允许使用功能强大的搜索算法从该索引中搜索…

Java124 0,AcWing 124. 数的进制转换java

package acwing寒假每日一题;import java.io.BufferedInputStream;import java.util.*;public class TransNumber {public static void main(String[] args) {Scanner in new Scanner(new BufferedInputStream(System.in));//n次操作int n in.nextInt();//输入字符串&#xf…

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;因为整个 函数库的所有数据都会被整合进目标…

Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String

我最近将支持Neo4j的应用程序从Neo4j 3.2升级到Neo4j 3.3&#xff0c;发现围绕类型强制的行为发生了有趣的变化&#xff0c;导致我的应用程序抛出了很多错误。 在Neo4j 3.2和更早版本中&#xff0c;如果将String添加到Double&#xff0c;它将把Double强制转换为String并连接值…

php7 php5.6 array,[转]php5.6 升级到php7及变化

不向后兼容的变更错误和异常处理相关的变更在 PHP 7 中&#xff0c;很多致命错误以及可恢复的致命错误&#xff0c;都被转换为异常来处理了。 这些异常继承自 Error 类&#xff0c;此类实现了 Throwable 接口 (所有异常都实现了这个基础接口)。这也意味着&#xff0c;当发生错误…

python 在末尾增加一个字符串,python - Python File.write在末尾添加额外的字符串 - SO中文参考 - www.soinside.com...

我正在使用python(3.6)更新文本文件&#xff0c;并打开r with open(f.play, r) as f2:play f2.read()result manipulate(play)print(result)f2.seek(0, 0)f2.write(result)通过这样做&#xff0c;我得到了意外的结尾部分ap:Envelope>当然&#xff0c;多余的部分是在第一次…