用Jackson处理“N / A”值为空

时间:2017-05-14 13:53:06

标签: java json jackson

我从外部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

(当数据中有日期时工作正常)

1 个答案:

答案 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命名的模块中收集所有转换器,这样可以让您按照这种方式处理。