jackson 在Java中如何计算JsonNode的大小(以字节/Kb/mb为单位)?

ar5n3qh5  于 7个月前  发布在  Java
关注(0)|答案(1)|浏览(151)

我需要在java中计算JSON响应的大小(以字节为单位)。在java中有没有一种方法来计算这个字节/kb/mb。
另外,在java中,我们使用Jackson库来创建JsonNode。
我们尝试使用下面的方法计算大小。不确定这是正确的或准确的大小。
jsonResponse.toString(). getString().length
我们需要比较通过数据库获取的json输出的大小和java代码中形成的json输出的大小。所以在postgresql中我们有pg_column_size()来计算json响应的大小。但是在java中,不确定我们是否有任何直接的方法来获得json的大小?

zqdjd7g9

zqdjd7g91#

更简单的方法是将JSON呈现为String,然后获取长度:

int calculateSize(JsonNode jsonNode) throws JsonProcessingException {
    var objectMapper = new ObjectMapper();
    var string = objectMapper.writeValueAsString(jsonNode);
    return string.length();
}

此操作可能会消耗时间/内存,因为完整的JSON内容需要呈现为String
一个更好的方法是使用递归函数遍历JSON节点,将总大小相加:

int calculateSize(JsonNode jsonNode) {
    if (jsonNode == null) {
        return 4; // null
    }
    if (jsonNode.isTextual()) {
        return 2 + jsonNode.asText().length(); // two quotes + string
    }
    if (jsonNode.isArray() || jsonNode.isObject()) {
        var size = new AtomicInteger(2); // square/curly brackets
        if (jsonNode.isObject()) {
            jsonNode.fieldNames().forEachRemaining(
                    field -> size.getAndAdd(3 + field.length())); // quoted key and colon
        }
        if (!jsonNode.isEmpty()) {
            size.getAndAdd(jsonNode.size() - 1); // commas
            jsonNode.elements().forEachRemaining(
                    element -> size.getAndAdd(calculate(element))); // recurs
        }
        return size.get();
    }
    return jsonNode.asText().length(); // boolean, number
}

此方法将遍历JSON内容,但内存消耗将最小。
注意:在呈现JSON时,某些实现可能会有所不同,例如,在JavaScript中,具有科学计数法的数字可以具有与Java中等效数字不同的长度。

相关问题