用杰克逊解析巨大的JSON

时间:2015-04-21 10:27:00

标签: java json jackson

考虑一个巨大的JSON,结构如 -

{"text": "very HUGE text here.."}

我将此JSON存储为名为ObjectNode的{​​{1}}对象。

现在我尝试从json

中提取此文本
ObjectNode

这个JSON的大小可以是4-5 MB。当我运行这段代码时,我得不到结果(程序一直在执行)。

上述方法适用于小型和普通大小的字符串。还有其他最佳实践从JSON中提取大量数据吗?

2 个答案:

答案 0 :(得分:2)

用jackson(fastxml)测试,7MB json节点可以在200毫秒内解析

    ObjectMapper objectMapper = new ObjectMapper();
    InputStream is = getClass().getResourceAsStream("/test.json");
    long begin = System.currentTimeMillis();
    Map<String,String> obj = objectMapper.readValue(is, HashMap.class);
    long end = System.currentTimeMillis();
    System.out.println(obj.get("value").length() + "\t" + (end - begin));

输出是: 7888888 168

尝试升级杰克逊?

答案 1 :(得分:1)

也许你的默认堆大小太小:如果输入是5兆UTF-8编码,它的Java String通常需要10兆内存(char是16位,大多数是UTF英语字符的-8是单字节)。 如果必须将值作为Java String处理,那么无论JSON库如何,您都无法做到这一点。你需要足够的内存来处理值和剩余的处理。此外,由于Java堆被分成不同的代,64兆可能或可能不起作用:因为10兆需要连续,它可能在旧一代中分配。

所以:看看尝试更大的堆大小,看看你需要多少。