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

迈克尔 杰克逊mv

在解析从我们的一个RESTful Web服务接收到的JSON字符串时,我收到此错误“线程“ main”中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“ person”(类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

迈克尔 杰克逊mv

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

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

相关文章

手机版wps怎么制作折线图_手机怎么制作电子签名?有没有手机电子签名软件或者APP?...

手机怎么制作电子签名&#xff1f;有没有手机电子签名软件或者APP&#xff1f;手机制作电子签名非常简单&#xff0c;当然也有移动版的电子签名软件或者APP。根据《电子签名法》第13条规定&#xff1a;电子签名同时符合下列条件的&#xff0c;视为可靠的电子签名&#xff1a;(一…

mysql查看主键别名_MySQL怎么查看约束的别名呢?

old神谕两种常用方法&#xff1a;① show index&#xff0c;其中key_name就是约束名SHOW INDEX IN table_name;(rootlocalhost) [test]> show index in a\G*************************** 1. row ***************************Table: aNon_unique: 1Key_name: idx_idSeq_in_ind…

Linux 命令之 less -- 分屏上下翻页浏览文件内容(查看文件内容/显示文件内容)

文章目录介绍语法格式常用选项浏览文本内容的快捷键向前滚屏向后滚屏跳跃搜索退出 less参考示例&#xff08;一&#xff09;查看文件&#xff08;二&#xff09;ps查看进程信息并通过less分页显示&#xff08;三&#xff09;查看命令历史使用记录并通过less分页显示&#xff08…

ajax.call失效无请求,移动端ajax请求问题?

我有两个问题&#xff0c;一个是我写了一个ajax请求&#xff0c;我想请求我本地服务器上的php文件&#xff0c;直接写本地路径和服务器路径时候&#xff0c;都会报错&#xff0c;告诉我需要跨域&#xff0c;于是我用jsonp去请求数据&#xff0c;写入的是服务器上的地址&#xf…

api网关和esb区别_具有ESB,API管理和Now .. Service Mesh的应用程序网络功能。

api网关和esb区别我最近谈论了微服务模式的演变&#xff0c;以及来自Lyft的Envoy之类的服务代理如何帮助将弹性&#xff0c;服务发现&#xff0c;路由&#xff0c;指标收集等责任推到应用程序下一层。 否则&#xff0c;我们冒着希望并祈祷各种应用程序将正确实现这些关键功能或…

是否可以改变 宏的值_给女人的建议:当父母不同意你的男朋友,可以尝试六个方法...

女生在面对感情婚姻的时候都应该深思熟虑&#xff0c;很多时候考虑问题应该全面一点&#xff0c;在现实生活中&#xff0c;一部分女生在和男朋友谈恋爱的时候&#xff0c;却没有得到父母的同意&#xff0c;甚至父母非常反对&#xff0c;在这个时候女生应该尝试六个方法&#xf…

mysql 存储过程求和_MySQL - 存储过程和函数

MySQL - 存储过程和函数创建和调用存储过程-- 创建stu_group()存储过程&#xff0c;封装 分组查询总成绩&#xff0c;并按照总成绩升序排序的功能-- 注意: DELIMITER 必须写在一行的最前面, 前面不能有空格####DELIMITER $CREATE PROCEDURE stu_group()BEGINSELECT gender,SUM(…

Shell脚本注释

文章目录单行注释多行注释/段注释一、空命令 : 和追加输入重定向 <<解决注释中有反引号的问题方法一方法二方法三方法四方法五二、空命令 : 和 if...then.. 语句三、空命令 : 和单引号 单行注释 直接在行最前端加上符号 # 即可。具体用法如下所示&#xff1a; # this i…

php云服务器买什么系统吗,php云服务器买什么系统

php云服务器买什么系统 内容精选换一换新购买的云硬盘怎么使用云硬盘是网盘吗云硬盘可以单独使用吗云硬盘购买后不使用会收费吗如何停止云硬盘收费如何查看云硬盘详细信息云硬盘的可用区可以变更吗云硬盘是否支持共享盘转非共享盘&#xff0c;普通IO转超高IO云硬盘已退订、误删…

FHS(Filesystem Hierarchy Standard 文件系统层次化标准)

文章目录一、根目录 (/) 的意义与内容二、/usr/ 的意义与内容三、/var/ 的意义与内容四、目录树(directory tree)五、绝对路径与相对路径FHS 是 File System Hierarchy Standard&#xff08;文件系统层次化标准&#xff09;的缩写&#xff0c;多数Linux 版本采用这种文件组织形…

apache.camel_在即将发布的Camel 2.21版本中改进了使用Apache Camel和ActiveMQ Artemis处理大型消息的功能...

apache.camel从历史上看&#xff0c; Apache ActiveMQ消息代理最初是在大型消息以MB为单位而不是GB的情况下创建的&#xff0c;就像您今天所做的那样。 下一代代理Apache ActiveMQ Artemis&#xff08;或仅是Artemis&#xff09;则不是这种情况&#xff0c;后者对大型消息的支…

double小数点后最多几位_用了这么多英语学习APP后,我还是最喜欢这4款

适合系统&#xff1a;安卓、iOS(后台回复「236」获取)学霸君曾经在知乎看到过一个问题&#xff1a;英语近几年会被淘汰吗&#xff1f;现在学英语还有什么用&#xff1f;底下点赞数最多的一个评论&#xff1a;不是英语即将淘汰&#xff0c;而是英语水平差到还需要艰难学英语的人…

mysql 如何凭借几个列_我如何总结MySQL中的几个列

在这种特殊情况下&#xff0c;使用WHERE会不会更容易&#xff1f;SELECT SUM(WTE) AS Band6_WTEFROM orthoptists AS oLEFT JOIN instances AS iON o.instance_FK i.idWHERE i.region 14AND band "E"对于一般情况&#xff0c;您可以使用GROUP BY&#xff0c;因为您…

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

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

Shell(bash) 介绍

文章目录Shell 介绍Shell 种类命令行环境终端模拟器命令行提示符进入和退出方法Shell 脚本第一个shell脚本BashBash如何解析命令Shell 和 Bash 的历史Shell 介绍 简单点理解&#xff0c;就是系统跟计算机硬件交互时使用的中间介质&#xff0c;它只是系统的一个工具。实际上&am…

mysql 5.7数据库密码_mysql5.7数据库忘记密码的解决方法

mysql5.7数据库忘记密码的解决方法发布时间&#xff1a;2020-09-08 11:56:53来源&#xff1a;亿速云阅读&#xff1a;60作者&#xff1a;小新这篇文章主要介绍了mysql5.7数据库忘记密码的解决方法&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完…

软件项目报价明细表_BIM必学软件之REVIT

BIM与Revit是什么关系呢&#xff1f;Revit在众多BIM软件中扮演什么角色&#xff0c;有什么意义?今天我们就来说说REVIT。BIM是建筑从项目立项、规划、概算、设计、预算、建造、结算、审计、物业等全生命周期中的智能动态控制系统&#xff0c;俗称建筑智能机器人系统。 BIM的关…

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

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

Linux 进程状态介绍

文章目录进程状态说明进程状态图进程状态说明 进程主状态&#xff1a;D&#xff1a;不可中断的睡眠状态 uninterruptible sleeping(usually IO)R&#xff1a;正在运行&#xff0c;或在队列中的 running or runnable (on run queue)S&#xff1a;处于休眠状态 interruptible sle…

petalinux 配置_澧县高压管道工厂化配置专业销售

澧县高压管道工厂化配置专业销售 公司生产设备齐全&#xff0c;热处理工艺精湛&#xff0c;检测设备&#xff0c;年生产能力上万吨&#xff0c;具备化学分析、全相检验、物理实验、无损探伤等检测能力。能生产各种标准的不锈钢、合金钢、碳钢弯头、无缝弯管、无缝三通、高压异径…