在我放心的测试中,我遇到了使用Jackson反序列化JSON的问题。 在我的JSON中,我有一个键“值”,可以是一个字符串数组或像布尔一样的对象。
{
"value": ["value1", "value2"]
}
或
{
"value": 2272204.2426
}
所以我为这个字段写了自定义反序列化器:
public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
if (node.isArray()) {
List<String> list = new ArrayList<>();
for (JsonNode elementNode : node) {
list.add(oc.treeToValue(elementNode, String.class));
}
return list;
} else {
if(node.isDouble()) {
return oc.treeToValue(node, Double.class);
}
else if(node.isBoolean()){
return oc.treeToValue(node, Boolean.class);
}
else {
return oc.treeToValue(node, String.class);
}
}
}
最后我注意到像2272204.2426这样的数值被反序列化为2272204.2 我尝试使用Gson对其进行去除,并且效果很好。你知道为什么使用杰克逊缺少小数部分吗? 我试图调试代码,我注意到在这一步JsonNode node = oc.readTree(jp);值为2272204.2
答案 0 :(得分:1)
为什么不使用杰克逊的ObjectMapper
?与DeserializationFeature
不同,您可以向其添加ObjectCodec
。 Mapper实际上正在扩展Codec,但在这种情况下你需要更多的功能。
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
JsonNode node = //node where the value is defined as Double
Double value = null;
try {
value = mapper.treeToValue(node, Double.class);
}
catch (IOException e) {
e.printStackTrace();
}
System.out.println(value);
在node.isDouble()
案例中使用上述逻辑