杰克逊JSON解析错误-UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...

在解析从我们的一个RESTful Web服务接收到的JSON字符串时,我收到此错误“线程“ main”中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“人”(类Hello $ Person),不是标记为“可忽略”

经过一番研究,我发现这是在Java应用程序中使用Jackson开源库解析JSON文档时的常见错误之一。 错误消息说在我们的例子中,它找不到合适的属性名称“ person”,让我们首先看一下我们要解析的JSON,我们用来表示JSON文档的类和错误。消息本身。

错误信息:

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:Unrecognized field "person" (class Hello$Person), not marked as ignorable (4 known properties: , "id", "city", "name", "phone"])

错误消息指出,它可以在Person类中找到ID,城市,名称和电话属性,但无法找到“ person”字段。

我们的POJO类如下所示:

class Person{private int id;private String name;private String city;private long phone;.....}

和JSON字符串:

{"person": [{"id": "11","name": "John","city": "NewYork","phone": 7647388372}]}

如果仔细看,“ person”字段指向JSON数组而不是对象,这意味着它不能直接映射到person类。

如何解决这个问题呢

以下是解决此问题并摆脱此错误的步骤:

1)配置encunger未知属性时,杰克逊的ObjectMapper不会失败

您可以通过禁用ObjectMapper的D eserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES属性来执行此操作,如下所示:

// Jackson code to convert JSON String to Java objectObjectMapper objectMapper = new ObjectMapper();objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);Person p = objectMapper.readValue(JSON, Person.class);System.out.println(p);

现在,错误将消失,但是输出不是您期望的,它将输出以下内容:

Person [id=0, name=null, city=null, phone=0]

您可以看到Person类没有正确创建,即使JSON String包含其值,相关属性也为null。

原因是JSON String包含一个JSON数组 ,person字段指向一个数组,而Person类中没有对应于该字段的字段。

为了正确地解析JSON字符串,我们需要创建一个包装器类Community ,它将具有一个属性来保留Person数组,如下所示:

static class Community {private List<Person> person;public List<Person> getPerson() {return person;}public void setPerson(List<Person> person) {this.person = person;}}

现在,我们将JSON字符串转换为该Community类,并从列表中打印每个人,如下所示:

ObjectMapper objectMapper = new ObjectMapper();//objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);Community c = objectMapper.readValue(JSON, Community.class);for (Person p : c.getPerson()) {System.out.println(p);}

这将正确打印人的详细信息,如下所示:

Person [id=11, name=John, city=NewYork, phone=7647388372]

现在,回到更普遍的情况, 在JSON上添加了一个新字段,但您的Person类中不提供新字段 ,让我们看看会发生什么。

假设我们要解析的JSON字符串如下:

{"person": [{"id": "11","name": "John","city": "NewYork","phone": 7647388372,"facebook": "JohnTheGreat"}]}

使用此JSON String运行相同的程序时,将出现以下错误:

同样, 杰克逊无法识别新的“ facebook”属性。 现在,我们可以通过禁用告诉Jackson在未知属性上失败的功能来忽略此属性,如下所示:

ObjectMapper objectMapper = new ObjectMapper();objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);Community c = objectMapper.readValue(JSON, Community.class);

这将正确打印人员类别,如下所示:

Person [id=11, name=John, city=NewYork, phone=7647388372]

或者,您也可以使用@JsonIgnoreProperties批注忽略未声明的属性。

@JsonIgnoreProperties是Jackson中的一个类级注释,它将忽略您尚未在POJO中定义的每个属性。 当您仅在JSON中查找几个属性并且不想编写整个映射时,此功能非常有用。

该注释在类级别提供控制,即您可以告诉Jackson ,对于该类,请忽略通过执行以下操作未定义的任何属性

@JsonIgnoreProperties(ignoreUnknown = true)

因此,我们的Person类现在看起来像:

@JsonIgnoreProperties(ignoreUnknown = true)static class Person{private int id;private String name;private String city;private long phone;......}

样例程序

import java.io.IOException;
import java.util.List;import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;/** {"person": [{"id": "11","name": "John","city": "NewYork","phone": 7647388372}]} */public class Hello {private static String JSON = "{\r\n" + " \"person\": [\r\n" + " {\r\n"+ " \"id\": \"11\",\r\n" + " \"name\": \"John\",\r\n"+ " \"city\": \"NewYork\",\r\n" + " \"phone\": 7647388372,\r\n"+ " \"facebook\": \"JohnTheGreat\"\r\n" + " }\r\n" + " ]\r\n" + " } ";public static void main(String args[]) throws JsonParseException,JsonMappingException, IOException {ObjectMapper objectMapper = new ObjectMapper();objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);Community c = objectMapper.readValue(JSON, Community.class);for (Person p : c.getPerson()) {System.out.println(p);}}static class Community {private List<Person> person;public List<Person> getPerson() {return person;}public void setPerson(List<Person> person) {this.person = person;}}static class Person {private int id;private String name;private String city;private long phone;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public long getPhone() {return phone;}public void setPhone(long phone) {this.phone = phone;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", city=" + city+ ", phone=" + phone + "]";}}
}

当我运行该程序的第一个版本时,遇到以下错误:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class Hello$Person]: can not instantiate from JSON object (need to add/enable type information?)at [Source: java.io.StringReader@5e329ba8; line: 2, column: 3]at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:984)at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:276)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 Hello.main(Hello.java:40)

发生此错误是因为我的嵌套类 Person不是静态的,这意味着由于具有任何Outer类实例而无法将其实例化。 使Person类变为静态后,该问题得以解决。

如果您以前不熟悉此细节,建议您检查一下
Java基础知识:核心平台 ,这是Pluralsight的免费课程,旨在学习有关Java编程语言的此类详细信息。 您可以注册一个免费试用版,这使您有10天的访问时间,足以免费学习整个Java。

现在,让我们看看真正的错误:

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:Unrecognized field "person" (class Hello$Person), not marked as ignorable (4 known properties: , "id", "city", "name", "phone"])at [Source: java.io.StringReader@4fbc9499; line: 2, column: 14] (through reference chain: Person["person"])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 Hello.main(Hello.java:40)

当您运行程序的最终版本时,将看到以下输出:

Person [id=11, name=John, city=NewYork, phone=7647388372]

这意味着我们能够在Jackson中成功解析包含未知属性的JSON 。

如何编译和运行该程序?

您可以简单地将代码复制粘贴到您喜欢的IDE(例如Eclipse)中,以编译和运行该程序。

在Eclipse中,您甚至不需要创建类文件,因为如果将代码复制粘贴到Java项目中,它将自动创建类和包。

如果Eclipse是您的主要IDE,并且您想了解更多这样的工作效率提示,建议您查看
Eclipse导览–第1部分和第2部分作者:Tod Gentille 。

这是一门免费的在线课程,旨在学习Eclipse IDE的基本和高级功能,这是每个Java开发人员都应注意的。 您可以通过注册免费试用版来访问此课程,从而使您有10天的时间访问整个Pluralsight库,这是学习编程和其他技术的最有价值的资源之一。 顺便说一句,十天就足够一起学习Java和Eclipse。

无论如何,一旦复制粘贴代码,您所需要做的就是在pom.xml中包含Maven依赖项,或者手动下载Jackson开源库所需的JAR文件 。

对于Maven用户

您可以在项目的pom.xml上添加以下Maven依赖项,然后运行mvn build或mvn install命令进行编译:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.2.3</version>
</dependency>

此依赖项需要jackson-corejackson-annotations但Maven会自动为您下载该依赖项。

手动下载JAR

如果您不使用Maven或任何其他构建工具eggradle,则可以转到Maven中央库并下载以下三个JAR文件,并将它们包括在类路径中:

jackson-databind-2.2.3.jar
jackson-core-2.2.3.jar
jackson-annotations-2.2.3.jar

一旦成功编译了类,就可以像在Eclipse中运行任何其他Java程序一样运行它们,如此处所示,或者可以使用命令行运行JAR文件,如下所示
在这里 。

简而言之,当您尝试将JSON解析为不包含JSON中定义的所有字段的Java对象时,会出现“ com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段XXX,未标记为可忽略”的错误。 您可以通过禁用Jackson的功能来解决此错误,该功能会告诉它如果遇到未知属性时将失败,或者通过在类级别使用注释@JsonIgnoreProperties@JsonIgnoreProperties

进阶学习

  • Spring MVC简介
  • Eugen Paraschiv的Spring REST
  • 使用Jersey的Java中的RESTFul Services

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

翻译自: https://www.javacodegeeks.com/2017/10/jackson-json-parsing-error-unrecognizedpropertyexception-unrecognized-field-not-marked-ignorable-solved.html

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

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

相关文章

mysql2008数据库配置_SQL Server 2008 R2 超详细安装图文教程

这篇文章主要介绍了SQL Server 2008 R2 超详细安装图文教程,需要的朋友可以参考下一、下载SQL Server 2008 R2安装文件二、将安装文件刻录成光盘或者用虚拟光驱加载&#xff0c;或者直接解压&#xff0c;打开安装文件&#xff0c;出现下面的界面安装SQL Server 2008 R2需要.NET…

hdfs读写流程_深度探索Hadoop分布式文件系统(HDFS)数据读取流程

一、开篇Hadoop分布式文件系统(HDFS)是Hadoop大数据生态最底层的数据存储设施。因其具备了海量数据分布式存储能力&#xff0c;针对不同批处理业务的大吞吐数据计算承载力&#xff0c;使其综合复杂度要远远高于其他数据存储系统。因此对Hadoop分布式文件系统(HDFS)的深入研究&a…

python可视化分析网易云音乐评论_Python数据可视化:网易云音乐歌单

网易云音乐2018年度听歌报告—遇见你&#xff0c;真好。相信有不少人在上周&#xff0c;应该已经看过自己网易云音乐的年度报告了。小F也是去凑凑热闹&#xff0c;瞅了一波自己的年度听歌报告。那么你在云村又听了多少首歌&#xff0c;听到最多的歌词又是什么呢?2018年你的年度…

mysql隔离级别验证_MySQL事务隔离级别以及验证

查询初始数据开启A事务  并做更新操作再另一端 B开始另一个事务查询 事务级别设置为读未提查询到事务未提交的数据 a的count修改为3 但是没有提交2 第二个级别 读已提交 避免脏读问题 但是有不可重复读问题回滚数据 修改隔离级别 确保都是 读已提交级别客户端A客户端B验证 脏…

登录样式:log4j 2,上下文,自动清除…全部不附加任何字符串!

日志记录-保持操作的时间跟踪-对于任何关键任务系统&#xff0c;无论大小&#xff0c;都至关重要。 我们的Project-X框架也是如此 &#xff0c;这就是为什么我们希望从一开始就正确地做到这一点。 基于我们在传奇的UltraESB上的登录经验&#xff0c; 上下文日志记录&#xff0…

python37安装失败_Linux 安装Python37

1、下载python3.7.0https://www.python.org/downloads/release/python-370/2、创建Linux的python37目录mkdir /usr/local/python373、解压python3.7.0源码tar zxvf python3.7.0.tar.zg4、配置编译参数./configure --prefix/usr/local/python375、make6、make install注意&#…

python string模块template_Python标准库笔记(1) — string模块

String模块包含大量实用常量和类&#xff0c;以及一些过时的遗留功能&#xff0c;并还可用作字符串操作。1. 常用方法常用方法描述str.capitalize()把字符串的首字母大写str.center(width)将原字符串用空格填充成一个长度为width的字符串&#xff0c;原字符串内容居中str.count…

注意力机制可视化_目标跟踪中的(STAM)时空注意力机制

目标跟踪分为单目标跟踪和多目标跟踪&#xff0c;单目标跟踪较为简单&#xff0c;这里我们只讨论多目标跟踪。多目标跟踪的遮挡问题多目标跟踪时特别容易发生目标间的相互遮挡&#xff0c;从而导致严重的预测偏移问题&#xff0c;如下图所示&#xff1a;红色框的行人在和蓝色框…

byteman_使用Byteman和JUnit进行故障注入

byteman我们的应用程序独立存在的时间已经很久了。 如今&#xff0c;应用程序是一种非常复杂的野兽&#xff0c;它们使用无数的API和协议相互通信&#xff0c;将数据存储在传统或NoSQL数据库中&#xff0c;通过网络发送消息和事件……例如&#xff0c;您多久考虑一次例如数据库…

java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?

小伙伴们知道如何在java栈中内存动态扩展吗?这是虚拟机中的一个概念&#xff0c;下面让我们一起来看看该如何实现吧。一、内存概念在java中&#xff0c;我们一般会简单把java内存区域划为两种&#xff1a;堆内存与栈内存。其实这种划分是比较粗粒度的。其中栈内存就是指的是虚…

python 爬虫热搜_Python网络爬虫之爬取微博热搜

微博热搜的爬取较为简单&#xff0c;我只是用了lxml和requests两个库1.分析网页的源代码&#xff1a;右键--查看网页源代码.从网页代码中可以获取到信息(1)热搜的名字都在的子节点里(2)热搜的排名都在的里(注意置顶微博是没有排名的&#xff01;)(3)热搜的访问量都在的子节点里…

优盘复制进来为空_为何电脑上的文件夹一复制到U盘里就变成空文件夹了?

(格式化后的卡在恢复前千万不要往里面存东西,因为这样会覆盖你想恢复的内容,如果你不小心存东西了也不要放弃,只不过恢复的机率会变小),下面开始:::在百度里输入Easy recover 软件找到后下载安装到电脑上,然后将内存卡与电脑连接,打开Easy recover 软件,首次打开时软件会分析系…

Spring Cloud教程–使用Spring Cloud Bus自动刷新配置更改

问题 在上一篇文章Spring Cloud Config Server简介 &#xff08; http://sivalabs.in/2017/08/spring-cloud-tutorials-introduction-to-spring-cloud-config-server/ &#xff09;中&#xff0c;我们已经了解了如何使用Spring Cloud配置服务器。 但是&#xff0c;问题是要重新…

js给标签添加属性和值_jquery节点属性

一.节点操作1.DOM内容节点操作&#xff1a;​ ①innerHTML属性&#xff1a;设置或获取文本的内容&#xff08;普通文本和标签&#xff09;。​ ②innerText属性&#xff1a;设置或获取文本的内容&#xff08;普通文本&#xff09;&#xff0c;存在兼容性问题。2.jQuery内容节点…

sci translate好用吗_228个学科分类对应12000+本SCI和SSCI期刊,总有你要的那款!

最近有很多小伙伴询问选刊的问题&#xff0c;而且都是非常具体的学科方向&#xff0c;我们的小编虽然非常热心且礼貌的回答“近期安排”&#xff0c;但其实我们也感觉到鸭梨山大:根据WOS最新一期&#xff08;2020/9/21&#xff09;名单公布&#xff0c;WOS目前总共收录了12266本…

java 反射 属性顺序_java反射得到的方法数组的顺序

展开全部看了下你好像需要set和get方法&#xff0c;如果你知道属性的名字的话不需要遍历可以这样获取&#xff0c;这个是我以前的demo的一个32313133353236313431303231363533e58685e5aeb931333332633561片段:Class clazzClass.forName("com.demo.reflectdemo.Student&quo…

arrays.sort(._Arrays.sort与Arrays.parallelSort

arrays.sort(.我们都使用Arrays.sort对对象和原始数组进行排序。 此API在下面使用合并排序或Tim排序对内容进行排序&#xff0c;如下所示&#xff1a; public static void sort(Object[] a) {if (LegacyMergeSort.userRequested)legacyMergeSort(a);elseComparableTimSort.sor…

python冒泡排序函数_python冒泡排序-Python,冒泡排序

arr[7,4,3,67,34,1,8].defbubble_sort:最近在学习Python&#xff0c;下面是我的一些笔记冒泡排序实现思路&#xff1a; 使用双重for循环&#xff0c;内层变量为i&#xff0c; 外层为j&#xff0c;在内层循环中不断的比较相邻的两个值(i, i1)的大小&#xff0c;如果i1的值大于i的…

适用于Idea的面向现代TDD的Java 8 JUnit测试模板(带有Mockito和AssertJ)

使用类似BDD的语法&#xff0c;Java 8和Mockito-AssertJ二重奏为Idea调整JUnit测试类模板。 本文涵盖的主题似乎很简单。 但是&#xff0c;根据我的培训师经验&#xff0c;我知道&#xff08;不幸的是&#xff09;这不是常见的做法。 因此&#xff0c;我决定写这篇简短的博客文…

python编程的基本方法有哪些_Python编程中常用的基础知识有哪些?

今天小编要跟大家分享的文章是关于Python编程中常用的基础知识有哪些?正在从事Python相关工作的小伙伴们&#xff0c;来和小编一起看一看本篇文章&#xff0c;希望本篇文章能够对大家有所帮助。1、正则表达式替换目标: 将字符串 line 中的 overview.gif 替换成其他字符串>&…