[英]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 代码处理这个对象,而不是将它存储在一个巨大的ArrayList
或HashMap
或其他东西中 - 以一种可以垃圾收集的方式之后,然后从流中读取更多字节,刚好足以容纳下一个对象,依此类推。
因此: 这个答案就是你想要的。
导出时需要使用--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.