首页 > 解决方案 > 更快的杰克逊不可能这么愚蠢(行尾)

问题描述

我正在使用一些现有的代码,这些代码使用常规的 Jackson 映射器并从 JSON 文件中读取一行,如下所示:

mapper.readValue(line, new TypeReference<Map<String, Object>>(){});

json 本身非常大,从技术上讲,它的格式不是很好,因为文件包含这样的 json(大量 json 对象之间没有逗号):

{...}

{...}

{...}

我在第一个对象中加入了一些“返回”,也就是行尾,以便更好地阅读它,所以现在它看起来像:{..., ...,

……,……}

{...}

{...}

你知道只是有点缩进至少能够阅读它。

我这样做的那一刻,我的单元测试开始失败:

Unexpected end-of-input within/between Object entries

自从我不得不在如此低的水平上与杰克逊打交道以来已经有一段时间了。我假设通常它会忽略 EOL 字符,如果它遇到以下情况:

{“核心价值”,

“核心价值”...

}

那么它与TypeReference正在使用的设置有关吗?

标签: javajackson

解决方案


该 TypeReference 想要生成一个 Map,它通常来自具有命名属性的单个 Json 对象,而不是由 \n 分隔的独立对象列表。

当然,包含由 \n 分隔的 json 对象的文件不是有效的 json。

如果您的代码正在读取每一行...直到下一个 \n 然后将该单个对象传递给 Jackson 进行解析,然后在对象中添加 \n 将导致您的代码开始将部分对象发送给 Jackson,从而产生如下错误你看到了。

不能说这是否是您正在发生的事情,但这是您想到的第一个想法。


推荐阅读