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

java+解析未知json

使用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是一个很好的起点。

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

让我们看看到目前为止我们所学到的一切。 顺便说一句,如果您对我的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

java+解析未知json

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

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

相关文章

双非计算机考研推荐学校传菜电梯,22考研双非院校排名Top100,前3名竟然是这几所!...

原标题&#xff1a;22考研双非院校排名Top100&#xff0c;前3名竟然是这几所&#xff01;大家好&#xff01;这里考个研吧&#xff01;近年来&#xff0c;很多双非高校发展进步很快&#xff0c;实力超过很多末流211大学&#xff01;国家也实行了双一流、学科评估等&#xff0c;…

4线电子围栏安装示意图_知识积累|周界防护-脉冲电子围栏的安装

如今人们对于住宅需求早已今非昔比&#xff0c;不但需要足够大的空间&#xff0c;而且对于住宅所处位置是否交通便利&#xff0c;环境如何&#xff0c;光照情况都有要求&#xff0c;但是最关注的问题还是住宅的安全问题。如今的社会科技发达&#xff0c;不法分子的手段也层出不…

内部收益率irr_介绍一个神器,内部收益率IRR

内部回报率IRR这个概念&#xff0c;艾米姐在很多地方都讲到了。可以这么说&#xff0c;任何的理财产品&#xff0c;都可以用这个概念来测算一下收益到底如何。听起来IRR确实很强大啊。那它到底是个什么东东呢&#xff1f;今天就来说一说。一、什么是内部收益率IRR&#xff1f;这…

如何在Java中处理ConcurrentModificationException? 在循环中从ArrayList中删除元素时要当心...

从Java中从ArrayList中删除元素时常见的问题之一是ConcurrentModificationException。 如果您对索引使用经典的for循环或增强的for循环&#xff0c;并尝试使用remove()方法从ArrayList中remove()元素&#xff0c;则将获得C oncurrentModificationException但如果使用Iterator的…

网络研讨室_网络研讨会:Java 9的第一印象–构建可伸缩企业应用程序的新方法...

网络研讨室在此网络研讨会上听我们对新Java版本的一些初步想法 关于Java 9的新版本&#xff0c;有很多宣传。将Java平台迁移到模块上&#xff0c;由Mark Reinhold领导的专门团队进行了近十年的艰苦工作。 除了备受期待的Project Jigsaw&#xff0c;此版本还包含许多其他令人兴…

react 日历组件_anujs1.5.1支持React.Suspense与lazy

React16是一个实验版本&#xff0c;除了测试它的新fiber架构外&#xff0c;还添加了大量新功能。其他React.Suspense与React.lazy就是重磅中的重磅。随着前端的APP化&#xff0c;不断集成功能&#xff0c;页面越来越大&#xff0c;bundle size以MB为单位&#xff0c;我们需要拆…

packt_Packt发行的$ 5 Java编程书籍:精通Java 9,Java 9高性能

packt你好&#xff0c;极客&#xff01; 今天&#xff0c;我们为您带来一些激动人心的消息&#xff01; Java Code Geeks和Packt联手为您提供广泛的书籍库每周折扣。 本周&#xff0c;我们提供Java相关书籍的折扣&#xff0c;以帮助您了解和掌握Java。 他们全都打折到每本书5…

redis 发布订阅实际案例_【赵强老师】Redis的消息发布与订阅

欢迎关注赵强老师微信公众号&#xff1a;myitshareRedis 作为一个publish/subscribe server&#xff0c;起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型&#xff0c;当发布者通过publish命令向Redis server发送特定类型…

上海大学计算机考研数一数二,2021年考研成绩出来了!上海大学数二人均135+,“神仙打架”现场...

原标题&#xff1a;2021年考研成绩出来了&#xff01;上海大学数二人均135&#xff0c;“神仙打架”现场文/跳跳妈妈谈教育2000年代初期&#xff0c;电视上流行这样一句话&#xff0c;“二十一世纪什么最珍贵&#xff1f;人才&#xff01;”时间如长河不断流逝&#xff0c;步入…

计算机配置界面在那,在哪里设置关机画面?设置为原来的经典界面?

电脑故障现象&#xff1a;我用的系统是winxp&#xff0c;关机出现的画面是那种下拉式菜单“注销、重启、关机、取消”&#xff0c;我想用的不是这种下拉式菜单&#xff0c;是并列图标那种&#xff0c;请问在哪里设置&#xff1f;(电脑入门到精通网 www.58116.cn)一般解决方法&a…

程序代码移植和烧录需要注意什么_购买建站模板需要注意什么问题

购买建站模板需要注意什么问题?现在市面上出现的建站工具质量参差不齐&#xff0c;但是如此多的建站模板&#xff0c;应该选择哪个呢&#xff1f;如此多的建站工具平台应该怎么样选择呢&#xff1f;这里我们来聊一聊。北京网站建设公司—东浩联创现在非常多站长都会购买一些定…

java 方法 示例_Java 9示例–收集的工厂方法–创建不可修改的列表,集合和映射...

java 方法 示例大家好&#xff0c;这是我在该博客上发表的有关Java 9功能的第一篇文章&#xff0c;今天您将了解我最喜欢的功能“收集的工厂方法” &#xff0c;它是JEP 269的一部分。JEP代表JDK增强建议。 如果您曾经在Groovy或Kotlin工作过&#xff0c;那么您就会知道使用集合…

高一计算机算法教案,高一信息技术第六章“第一节程序设计的基本方法”教案设计...

一、教学目标1&#xff0e;理解算法的概念&#xff1b;2&#xff0e;知道两种算法的描述方法—语言描述法和流程图的区别3&#xff0e;能初步利用算法解决简单的问题。4&#xff0e;培养学生的理论联系实际能力和动手操作能力。二、教学重难点1&#xff0e;重点&#xff1a;算法…

openshift安装_云幸福–如何在几分钟内安装新的OpenShift Container Platform 3.7

openshift安装此安装需要安装Red Hat Middleware产品流&#xff08;预配置的容器选项&#xff09;以及所有其他功能&#xff0c;例如源容器&#xff0c;映像容器和.Net Core容器。自OpenShift容器平台发布以来&#xff0c;我一直希望提供一个简单的方法。 &#xff0c;完全配置…

简单的计算机程序代码,优秀程序员通过简单代码,窥探电脑编程中强大的数组操作功能...

优秀程序员通过简单代码&#xff0c;窥探电脑编程中强大的数组操作功能。编程语言中&#xff0c;数组是一个非常重要的概念&#xff0c;也是一种很常用的类型。本文中通过javascript语言的代码实例&#xff0c;展现编程中数组的魅力。在javascript语言中&#xff0c;数组Array类…

java 示例_功能Java示例 第3部分–不要使用异常来控制流程

java 示例这是称为“ Functional Java by Example”的系列文章的第3部分。 我在本系列的每个部分中开发的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在前面的部分中&#xff0c;我从一些原始代码开始&#xff0c;并应用了一些重构来描述“什么”而不是“如何”。…

win7 计算机定时关机脚本,win7怎么定时关机?win7定时关机设置两种方法

当我们在操作电脑的时候&#xff0c;有时会有需要定时关机&#xff0c;或者不在电脑前操作是需要过段时间自动关机&#xff0c;但是Win7系统没有自带的定时关机软件&#xff0c;很多电脑用户又不喜欢安装第三方软件来完成该操作。那么win7怎么定时关机&#xff1f;本文为大家介…

java面试spring_针对Java程序员的二十大Spring REST面试问题答案

java面试spring大家好&#xff0c;过去两周来&#xff0c;我一直在与Spring教程共享一些REST&#xff0c;今天&#xff0c;我将向申请Web开发人员角色的Java开发人员共享一些常见的Spring和REST采访问题。 由于Spring Framework是用于开发Java Web应用程序和RESTful Web Servic…

springboot jwt token前后端分离_「转」七个开源的 Spring Boot 前后端分离项目,建议收藏加转载...

其实前后端分离本身并不难&#xff0c;后段提供接口&#xff0c;前端做数据展示&#xff0c;关键是这种思想。很多人做惯了前后端不分的开发&#xff0c;在做前后端分离的时候&#xff0c;很容易带进来一些前后端不分时候的开发思路&#xff0c;结果做出来的产品不伦不类&#…

联想办公计算机,办公娱乐两不误!联想这些笔记本电脑不容错过

【PConline 海选导购】随着技术的进步&#xff0c;如今的笔记本电脑性能越来越强&#xff0c;尤其是笔记本电脑携带更加方便&#xff0c;可以让你摆脱使用场景的限制&#xff0c;能随时随地畅玩游戏或者进行日常办公&#xff0c;有着台式机无可比拟的优势&#xff0c;因此&…