javascript
迈克尔 杰克逊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-core和jackson-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
總結
以上是生活随笔為你收集整理的迈克尔 杰克逊mv_杰克逊JSON解析错误– UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网关配置linux(网关配置 linux
- 下一篇: 重启linux系统命令(重启linux系