json Jackson双曲

ddarikpa  于 10个月前  发布在  其他
关注(0)|答案(2)|浏览(105)

我在rest-assured测试中使用Jackson对JSON进行了格式化,在我的JSON中,我有一个关键字“value”,它可以是String数组或类似Boolean的对象。

{
 "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

kqlmhetl

kqlmhetl1#

为什么不使用来自Jackson的ObjectMapper呢?你可以添加DeserializationFeature到它,不像ObjectCodec。Map器实际上是扩展编解码器,但有更多的功能,你需要在这种情况下。

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

kognpnkq

kognpnkq2#

在添加**@AllArgsConstructor**后,我成功地将双精度浮点数化

@AllArgsConstructor
public class Data {
    private final Double first;
    private final Double second;
    private final Double third;
}

字符串

相关问题