Jackson 反序列化 Double

问题描述 投票:0回答:2

我在放心测试中使用 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 对其进行反序列化,效果很好。你知道为什么使用 Jackson 时缺少小数部分吗? 我尝试调试代码,我注意到在这一步 JsonNode node = oc.readTree(jp);该值为 2272204.2

java json jackson deserialization rest-assured
2个回答
3
投票

为什么不使用 Jackson 的

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()
案例中使用上述逻辑


0
投票

添加 @AllArgsConstructor

后我成功地反序列化了双精度数
@AllArgsConstructor
public class Data {
    private final Double first;
    private final Double second;
    private final Double third;
}
© www.soinside.com 2019 - 2024. All rights reserved.