我从外部JSON API获取数据并使用Jackson解析结果。不幸的是,该API会将所有字段作为String
返回,当数据不可用时,这些字段将填充"N/A"
。
我想用null
替换这些字段,特别是当我尝试将JSON字符串字段转换为更具信息性的Java字段时,这些字段令人沮丧。
自定义DeserializationProblemHandler
适用于Integer
字段(见下文),但它对Java 8的LocalDate
字段无效。此外,它会对问题做出反应而不是预测它。
我无法找到要配置到ObjectMapper
的预处理器,并且对覆盖BeanDeserializer
的想法感到不安。
您是否知道处理此类情况的更好/更清洁的解决方案?谢谢!
DeserializationProblemHandler
new DeserializationProblemHandler() {
@Override
public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType, String valueToConvert, String failureMsg) throws IOException {
return "N/A".equals(valueToConvert) ? null : super.handleWeirdStringValue(ctxt, targetType, valueToConvert, failureMsg);
}
}
处理"N/A"
字段中的LocalDate
时出现错误消息
Can not deserialize value of type java.time.LocalDate from String "N/A": Text 'N/A' could not be parsed at index 0
(当数据中有日期时工作正常)
答案 0 :(得分:1)
我觉得应该有更好的方法来做到这一点,但以下是我能够提出的唯一解决方案。
创建一个处理“N / A”输入的新JsonDeserializer
。以下示例处理字符串:
public class EmptyStringDeserializer extends StdScalarDeserializer<String> {
public EmptyStringDeserializer() {
super(String.class);
}
@Override
public String deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
final String val = parser.getValueAsString();
if ("N/A".equalsIgnoreCase(val))
return null;
return val;
}
}
该类已注册ObjectMapper
,如下所示:
SimpleModule simpleModule = new SimpleModule().addDeserializer(String.class, new EmptyStringDeserializer());
ObjectMapper om = new ObjectMapper().registerModule(simpleModule);
您可能希望在以API命名的模块中收集所有转换器,这样可以让您按照这种方式处理。