企业网站建设多长时间,力软敏捷开发框架可以做网站后台,网络品牌营销策略,做网站有什么框架使用Jackson API在Java中解析JSON时的常见问题之一是#xff0c;当您的JSON包含未知属性#xff08;即您的Java类没有对应于所有JSON属性的所有字段#xff09;时#xff0c;该操作将失败。 例如#xff0c;如果您正在使用REST Web服务中的JSON#xff0c;并且明天他们在… 使用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 APIjQuery和REST Web Services进行JSON是一个不错的起点。 使用Jackson解析JSON时忽略未知属性的Java程序 让我们看看到目前为止我们所学到的一切。 顺便说一句如果您对我的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 {// lets 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 [titleEffective Java, authorJoshua Bloch, price37] 我有一个名为EBook的模型类该类用JsonIgnoreProperties ignoreUnknown true注释以忽略未知属性。 如果仔细观察我们的JSON字符串包含Java类中未定义的“ edition”属性但该程序可以运行因为我们已使用JsonIgnoreProperties ignoreUnknown true标记了EBook。 如果要测试此程序则只需删除该批注并运行该程序它将引发以下错误。 Exception in thread main com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized fieldedition (class EBook), not marked as ignorable (3 known properties: , title, price, author])
at [Source: java.io.StringReader19dfb72a; 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.configureDeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIESfalse行并运行程序。 这一次它也将起作用因为杰克逊忽略了所有未知属性。 这就是在使用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 APIjQuery和REST Web服务的JSON 感谢您到目前为止阅读本文。 如果您喜欢这篇文章请与您的朋友和同事分享。 如果您有任何疑问或疑问请留下笔记。 翻译自: https://www.javacodegeeks.com/2018/01/ignore-unknown-properties-parsing-json-java-jackson-jsonignoreproperties-annotation-example.html