【问题标题】:How to parse Json Array not separted by comma in java如何在java中解析没有用逗号分隔的Json数组
【发布时间】:2021-12-09 07:05:40
【问题描述】:

我有一个来自 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);

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

【问题讨论】:

  • 也许this可以帮助你。
  • 您能否扩展“无法手动修改 json,因为它是 15GB 的文本。”修好后你打算用它做什么? .你能先用 bash 预处理吗?

标签: java json mongodb jackson


【解决方案1】:

Table[] tablesFromJSON = mapper.readValue

您的机器是否安装了 ~64GB 的 RAM?因为否则,任何尝试将这个特技与 15GB .json 文件相比,都将花费很长时间,然后显然会以 OutOfMemoryError 结束。

因此,我非常怀疑你是否真的想要你所要求的。

相反,您希望流式传输这些数据。拿InputStream,使用一些JSON库从流中读取一个 json对象,用java代码处理这个对象,将它存储在一个巨大的@中987654326@ 或 HashMap 或其他什么 - 以某种方式将其作为垃圾回收之后,然后从流中读取更多字节,刚好够下一个对象,依此类推。

因此:This answer 就是你想要的。

【讨论】:

  • 这确实解决了问题,谢谢!
【解决方案2】:

导出时需要使用--jsonArray参数。更多详情here

【讨论】:

  • 很遗憾我没有导出文件,我只是被分配使用它
  • 您可以要求他们提供正确的 JSON。由于这也可能影响其他地方,因此不仅杰克逊会失败,而且所有其他遵循 JsonSchema 的库都会失败。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多