繁体   English   中英

如何在java中解析不以逗号分隔的Json数组

[英]How to parse Json Array not separted by comma in java

我有一个来自 mongodb 导出的 db.json 文件。 json 的结构如下:

{
"item1" : "test",
"item2" : "test",
"item3" : "test"
}
{
"item1" : "string",
"item2" : "string",
"item3" : "string"
}

如您所见,它没有逗号分隔符,也没有格式化为序列化对象的集合。

我正在尝试使用 Jackson 将此 db.json 反序列化为一个 java 类,但显然它只解析第一对括号,因为这在标准 json 格式中不被识别为数组。 要被认可,它应该是这样的。

[{
"item1" : "test",
"item2" : "test",
"item3" : "test"
},
{
"item1" : "string",
"item2" : "string",
"item3" : "string"
}]

我无法手动修改 json,因为它是 15GB 的文本。 这是我试过的

ObjectMapper mapper = new ObjectMapper();
Table[] tablesFromJSON = mapper.readValue(Paths.get("db.json").toFile(), Table[].class);

我应该如何解决这个问题?

Table[] tablesFromJSON = mapper.readValue

您的机器是否安装了约 64GB 的 RAM? 因为否则,任何尝试与 15GB .json文件进行对比的尝试都将花费很长时间,然后显然会出现OutOfMemoryError

因此,我非常怀疑您是否真的想要您似乎在要求的东西。

相反,您希望流式传输此数据。 InputStream ,使用一些 JSON 库从流中读取一个json 对象,用 java 代码处理这个对象,而不是将它存储在一个巨大的ArrayListHashMap或其他东西中 - 以一种可以垃圾收集的方式之后,然后从流中读取更多字节,刚好足以容纳下一个对象,依此类推。

因此: 这个答案就是你想要的。

导出时需要使用--jsonArray参数。 更多细节在这里

自己编写一个自定义的 JSON 解析器并不难。 如果您不想从头开始编写,可以重用 jackson 提供的一些类。

一个天真的例子:

var reader = new ObjectMapper()
      .disable(JsonParser.Feature.AUTO_CLOSE_SOURCE)
      .reader();

var input = new StringReader("[1,2,3] \"hello\" {\"name\":\"aa\"} true false") {
    public int read(char[] cbuf, int off, int len) throws IOException {
        return super.read(cbuf, off, 1);
    }
};
JsonNode node;
while ((node = reader.readTree(input)) != null) {
    System.out.println(node);
}

此代码打印

[1,2,3]
"hello"
{"name":"aa"}
true
false

这是一个丑陋的 hack 并且性能可能很差,因为它一次只读取一个char而不是填充整个char[] ,但它有效。 我可以但不想编写大量代码来优化它。

有一个 java 库可以将 JSON 字符串转换为 java 对象。 以您想要的方式快速解析/生成 JSON。 在每个级别配置/验证 JSON。

请参考 Quick-Json Lib https://code.google.com/p/quick-json/有很好的例子和解释。 可能这会帮助你。 库文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM