- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前正在努力通过以下方式使用 Jackson 进行 Java JSON 反序列化:
我想处理和反序列化从 Web 服务返回的 JSON 响应,并在 Jackson 的帮助下将响应转换为 POJO。这在大多数情况下都能正常工作,只要我收到的响应包含格式正确的 JSON 属性即可。
然而,网络服务和传送的数据不在我的控制范围内,我不能指望数据始终采用正确的格式。
举个例子:
在我的 POJO 中,有一个 java.util.Date
字段,JSON 响应包含一个包含日期时间字符串的属性。 Jackson 将尝试解析字符串并将其转换为 Date
。如果日期格式与 ObjectMapper 的
日期格式 (ObjectMapper.setDateFormat(...)
) 匹配,则一切正常。如果格式不同,我会得到一个 InvalidFormatException
。
现在的问题是,服务发送的日期格式可能不同。我可以获得格式为 2014-11-02T00:00:00Z
的日期,但我也可以获得格式为 2014-11
的日期(仅标识一个月份而不是一个月份)整个日期时间)。
我知道,我可以编写一个自定义反序列化器,它可以处理这种情况并正确处理具有不同日期格式的日期字符串。但由于这只能解决 Dates
的问题,而不能解决其他潜在数据类型的问题,因此我正在寻找一种更通用的方法。(例如,如果我期望一个 Double 并收到一个字母数字字符串,会发生什么?)
我希望能够忽略所有发生 InvalidFormatException
的情况,并为相应的 POJO 字段定义默认值(如 null
)。
这对我来说真的很有值(value),如果尽管返回了无效的日期格式或任何其他 InvalidFormatException
发生,JSON 的其余部分 仍然是反序列化到POJO中。
Jackson 有可能做到这一点吗?
感谢您阅读我的问题直到最后,我将不胜感激任何指向正确方向的指示。
最佳答案
不确定这是否是最佳实践,我对 Jackson 没有什么经验。
您可以将 DeserializationProblemHandler
添加到 ObjectMapper
以指定当反序列化器遇到奇怪的字符串或奇怪的数字时会发生什么。
在您的情况下,您可以设置处理程序,以便在遇到无法识别的格式时,它不会抛出 InvalidFormatException
,而是返回 null:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addHandler(new DeserializationProblemHandler() {
@Override
public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType, String valueToConvert, String failureMsg) throws IOException {
return null;
}
@Override
public Object handleWeirdNumberValue(DeserializationContext ctxt, Class<?> targetType, Number valueToConvert, String failureMsg) throws IOException {
return null;
}
});
关于java - 如何优雅地处理 Jackson InvalidFormatException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26699227/
我找不到关于 jackson 的ObjectMapper与其他映射器(例如dozer/mapStruct/modelMapping/etc)之间的区别的任何解释。所有文章都比较了dozer/mapSt
我正在使用Jackson来反序列化Kotlin数据类。我正在使用jackson-kotlin-module,但 jackson 却给我以下错误: Can not construct instance
我正在尝试将包从“com.fasterxml.jackson”重新定位到我自己的包(即“mypackage.com.fasterxml.jackson”),然后在我拥有的另一个 JAR 中使用它。 我
对于JSON对象,Subject: { "permissions":["foo", "bar"], ... } ...我想反序列化为: class Subject { priv
我正在使用 @JsonTypeInfo 和 @JsonSubTypes 来映射基于给定属性的解析子类。这是我想要解析的示例 JSON 的一个人为示例。 { "animals": [ { "
我们正在使用 dropwizard 版本 0.6.3。当我们尝试升级 0.7.0 版本时,我们在服务启动时收到此错误。 线程“main”中的异常 java.lang.VerifyError: clas
我正在尝试实现自定义解串器。因为我只想向默认反序列化器添加功能,所以我尝试在我的自定义反序列化器中存储默认反序列化器:我想使用默认反序列化 json,然后添加其他信息。 我正在尝试使用 BeanDes
我有一个这样的类(class): public class Person { private String name; public String getName(){ return
我有以下 Kotlin 数据类: data class TestObject( val boolField: Boolean, val stringField: Str
使用 Jackson 库,在 Eclipse 4.9.0 版本中出现以下错误 缺少工件 com.fasterxml.jackson.core:jackson-databind:bundle:2.9.6
我试图在我的应用程序中从azure实现keyvault,在为DefaultAzureCredentialBuilder()实现azure-identity:1.5.4 lib后,它会抛出链接错误,如下
我试图在我的应用程序中从azure实现keyvault,在为DefaultAzureCredentialBuilder()实现azure-identity:1.5.4 lib后,它会抛出链接错误,如下
我知道我们可以使用 Jackson MixIn 来重命名属性或忽略属性(参见示例 here )。但是可以添加属性吗? 添加的属性可以是: 一个常数(如版本号) 计算值(例如,如果源类具有 getWid
我有一个在 Wildfly 10 上运行的应用程序,它需要更新版本的 jackson。简单地更新 maven 依赖是行不通的。 Wildflys 自己的版本似乎干扰了... 有人有提示吗? 最佳答案
我在 Tomcat 休息应用程序中运行 Jersey 2.5.1 & Jackson。对于我最初将 POJO 简单地转换为 JSON 的用例,基本设置效果很好。集合很好地转换为 json 数组,如下所
有没有办法告诉 jackson 在序列化过程中忽略那些用非 jackson 注释注释的字段? 例如: @SomeAnnotation private String foo; 我知道有 jackson
我遇到了 jackson 序列化问题, map 中存在空值。显然,这是 Wildfly 9 使用的 Jackson 版本中的一个已知错误 ( https://issues.jboss.org/brow
给定一个像这样的 JSON 映射类: public class Person { @JsonProperty String getName() { ... } @JsonPro
如何让 Jackson 的 XMLMapper 在反序列化时读取根 xml 元素的名称? 我正在将输入 XML 反序列化为通用 Java 类、LinkedHashMap,然后反序列化为 JSON。我想
我对抽象类和 JSON 序列化和反序列化的对象引用有问题。抽象的问题如下所示: 我有一个由节点和边组成的图。每条边连接两个节点。节点可以是红色和绿色的。因此,有一个抽象类Node和两个派生类 RedN
我是一名优秀的程序员,十分优秀!