javascript
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
總結
以上是生活随笔為你收集整理的java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 生查子怎么读 生查子的简介
- 下一篇: 疏懒是什么意思 疏懒的含义是什么
