2

我有一些 JSON 数据,InputStream我需要将其拆分为不大于 5MB 的部分并分别上传。我有一个可行的解决方案(如下)来执行此操作,但是当我遍历 JSON 节点时,获取生成的 JSON 的大小需要的时间越来越长。

我尝试获取每个节点的大小并将其添加到全局“总”变量(这非常快),但这并没有考虑将在最终生成的 JSON 中分隔所有节点的逗号。 想法:如果我这样做直到阈值,然后删除节点,直到最终生成的所有逗号的 JSON 都低于阈值,该怎么办?

我正在使用杰克逊罐子,不想只为这件小事使用其他任何东西。

这是输入数据的格式:

[
    { "nodeData": 1 },
    { "nodeData": 2 },
    { "nodeData": 3 }
]

这是我的工作 Java 代码:

ObjectMapper jsonMapper = ...
JsonNode tree = jsonMapper.readTree(inputStream);
List<JsonNode> nodeParts = new ArrayList<JsonNode>();

if (tree != null) {
    for (Iterator<JsonNode> nodes = tree.elements(); nodes.hasNext();) {
        JsonNode node = nodes.next();

        nodeParts.add(node);

        // this takes longer and longer as the nodeParts List grows
        byte[] bytes = jsonMapper.writeValueAsBytes(nodeParts);

        if (bytes.length > UPLOAD_SIZE_BYTES_THRESHOLD) {
            bytes = null;
            // remove the one we just added that put it over the threshold
            nodeParts.remove(nodeParts.size() - 1);

            // upload nodeParts

            nodeParts.clear();
            nodeParts.add(node);
        }
    }
}
4

0 回答 0