日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發(fā)布時間:2023/12/3 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杰克逊JSON解析错误-UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在解析從我們的一個RESTful Web服務(wù)接收到的JSON字符串時,我收到此錯誤“線程“ main”中的異常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:無法識別的字段“人”(類Hello $ Person),不是標(biāo)記為“可忽略” 。

經(jīng)過一番研究,我發(fā)現(xiàn)這是在Java應(yīng)用程序中使用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數(shù)組而不是對象,這意味著它不能直接映射到person類。

如何解決這個問題呢

以下是解決此問題并擺脫此錯誤的步驟:

1)配置encunger未知屬性時,杰克遜的ObjectMapper不會失敗

您可以通過禁用ObjectMapper的D eserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES屬性來執(zhí)行此操作,如下所示:

// 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);

現(xiàn)在,錯誤將消失,但是輸出不是您期望的,它將輸出以下內(nèi)容:

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

您可以看到Person類沒有正確創(chuàng)建,即使JSON String包含其值,相關(guān)屬性也為null。

原因是JSON String包含一個JSON數(shù)組 ,person字段指向一個數(shù)組,而Person類中沒有對應(yīng)于該字段的字段。

為了正確地解析JSON字符串,我們需要創(chuàng)建一個包裝器類Community ,它將具有一個屬性來保留Person數(shù)組,如下所示:

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

現(xiàn)在,我們將JSON字符串轉(zhuǎn)換為該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]

現(xiàn)在,回到更普遍的情況, 在JSON上添加了一個新字段,但您的Person類中不提供新字段 ,讓我們看看會發(fā)生什么。

假設(shè)我們要解析的JSON字符串如下:

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

使用此JSON String運行相同的程序時,將出現(xiàn)以下錯誤:

同樣, 杰克遜無法識別新的“ facebook”屬性。 現(xiàn)在,我們可以通過禁用告訴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中定義的每個屬性。 當(dāng)您僅在JSON中查找?guī)讉€屬性并且不想編寫整個映射時,此功能非常有用。

該注釋在類級別提供控制,即您可以告訴Jackson ,對于該類,請忽略通過執(zhí)行以下操作未定義的任何屬性

@JsonIgnoreProperties(ignoreUnknown = true)

因此,我們的Person類現(xiàn)在看起來像:

@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 + "]";}} }

當(dāng)我運行該程序的第一個版本時,遇到以下錯誤:

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)

發(fā)生此錯誤是因為我的嵌套類 Person不是靜態(tài)的,這意味著由于具有任何Outer類實例而無法將其實例化。 使Person類變?yōu)殪o態(tài)后,該問題得以解決。

如果您以前不熟悉此細節(jié),建議您檢查一下
Java基礎(chǔ)知識:核心平臺 ,這是Pluralsight的免費課程,旨在學(xué)習(xí)有關(guān)Java編程語言的此類詳細信息。 您可以注冊一個免費試用版,這使您有10天的訪問時間,足以免費學(xué)習(xí)整個Java。

現(xiàn)在,讓我們看看真正的錯誤:

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)

當(dāng)您運行程序的最終版本時,將看到以下輸出:

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

這意味著我們能夠在Jackson中成功解析包含未知屬性的JSON 。

如何編譯和運行該程序?

您可以簡單地將代碼復(fù)制粘貼到您喜歡的IDE(例如Eclipse)中,以編譯和運行該程序。

在Eclipse中,您甚至不需要創(chuàng)建類文件,因為如果將代碼復(fù)制粘貼到Java項目中,它將自動創(chuàng)建類和包。

如果Eclipse是您的主要IDE,并且您想了解更多這樣的工作效率提示,建議您查看
Eclipse導(dǎo)覽–第1部分和第2部分作者:Tod Gentille 。

這是一門免費的在線課程,旨在學(xué)習(xí)Eclipse IDE的基本和高級功能,這是每個Java開發(fā)人員都應(yīng)注意的。 您可以通過注冊免費試用版來訪問此課程,從而使您有10天的時間訪問整個Pluralsight庫,這是學(xué)習(xí)編程和其他技術(shù)的最有價值的資源之一。 順便說一句,十天就足夠一起學(xué)習(xí)Java和Eclipse。

無論如何,一旦復(fù)制粘貼代碼,您所需要做的就是在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-core和jackson-annotations但Maven會自動為您下載該依賴項。

手動下載JAR

如果您不使用Maven或任何其他構(gòu)建工具eggradle,則可以轉(zhuǎn)到Maven中央庫并下載以下三個JAR文件,并將它們包括在類路徑中:

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

一旦成功編譯了類,就可以像在Eclipse中運行任何其他Java程序一樣運行它們,如此處所示,或者可以使用命令行運行JAR文件,如下所示
在這里 。

簡而言之,當(dāng)您嘗試將JSON解析為不包含JSON中定義的所有字段的Java對象時,會出現(xiàn)“ com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:無法識別的字段XXX,未標(biāo)記為可忽略”的錯誤。 您可以通過禁用Jackson的功能來解決此錯誤,該功能會告訴它如果遇到未知屬性時將失敗,或者通過在類級別使用注釋@JsonIgnoreProperties來@JsonIgnoreProperties 。

進階學(xué)習(xí)

  • 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

總結(jié)

以上是生活随笔為你收集整理的杰克逊JSON解析错误-UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。