用Jackson处理"N/A"值为空

Cho*_*hop 5 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

"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
Run Code Online (Sandbox Code Playgroud)

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

Hen*_*sen 1

我觉得应该有更好的方法来做到这一点,但以下是我能想到的唯一解决方案。

创建一个新的JsonDeserializer来处理“N/A”输入。以下示例处理字符串:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

该类的注册方式如下ObjectMapper

SimpleModule simpleModule = new SimpleModule().addDeserializer(String.class, new EmptyStringDeserializer());
ObjectMapper om = new ObjectMapper().registerModule(simpleModule);
Run Code Online (Sandbox Code Playgroud)

您可能希望将所有转换器收集在一个以 API 命名的模块中,该 API 使您能够以这种方式处理事情。