我从外部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)
(当数据中有日期时工作正常)
我觉得应该有更好的方法来做到这一点,但以下是我能想到的唯一解决方案。
创建一个新的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 使您能够以这种方式处理事情。
| 归档时间: |
|
| 查看次数: |
691 次 |
| 最近记录: |