0

我在解析一个巨大的 json 文件(200mb)时遇到问题。起初我尝试使用 JACKSON 将 json 解析为树。但是,我遇到了堆大小问题。出于某种原因,增加堆大小不是一种选择。

JSON格式:

{ 
    "a1":{ "b1":{"c1":"somevalue", "c2":"somevalue"}, ... },
    "a2":{ "b1":{"c1":"somevalue"},"c3":"somevalue"}, ... },
    ....
}

我想做的是产生像这样的字符串

str1 = "{ "b1":{"c1":"somevalue", "c2":"somevalue"}, ... }"
str2 = "{ "b1":{"c3":"somevalue"},"c4":"somevalue"}, ... }"

有没有办法在没有堆问题的情况下做到这一点?

在 python 中,有一种简单的方法可以做到这一点并且没有堆问题(没有 JVM)

data  = json.loads(xxx)
for key,val in data.iteritems():
    puts val

一些想法:我可能不需要使用杰克逊树方法,因为我只想要字符串。流式处理 Jackson 可能是一种选择,但我很难编写它,因为我们的 json 格式非常灵活。任何建议将不胜感激!

谢谢

4

2 回答 2

0

使用基于对象的数据绑定更节省内存,因此如果您可以定义 Java 类以匹配结构,这是更好的方法:更快,使用更少的内存。但有时在事先不知道结构的情况下需要树模型。

流式 API 可以提供帮助,您还可以混合使用方法:迭代 JSON 令牌,然后使用JsonParser.readValueAs(MyType.class)or JsonParser.readValueAsTree()。这使您只能为 JSON 输入的子集构建内存树或对象。

于 2013-07-22T17:40:13.940 回答
0

最后我使用流式方法。我从 http 打开一个流,每次读取固定数量的字节来缓冲。在我确定我已经在缓冲区中构建了一个有效的字符串之后,我发出了字符串并截断了缓冲区。这样,我使用的内存很少。谢谢!

于 2013-07-25T09:19:30.273 回答