小编典典

jackon JSON库中的ALLOW_UNQUOTED_FIELD_NAMES

spring

我正在使用jackson库对JSON进行序列化/反序列化。我需要此JSON的大小尽可能小,所以我启用了功能ALLOW_UNQUOTED_FIELD_NAMES以消除所有引号。我知道删除引号不是标准的json,但是将json缩小是该项目的一项硬要求。生成的json有效,但是当我尝试读取json值时,出现异常:

org.codehaus.jackson.JsonParseException:意外的字符(“ 9”(代码57)):期望有效的名称字符(对于未加引号的名称)或双引号(对于加引号的字符)在[Source处以字段名开头.StringReader @ 1347d75; 行:1,列:3]

当我阅读此json时,抛出以上异常:

{90110a2e-febd-470f-afa4-cf7e890d31b9:0,eec652ad-a4d9-4eb1-8d24-7c1a0c29449f:1}

我的阅读方式是:

Map<String, Object> valuesMap = oM.readValue(json, new TypeReference<Map<String, Object>>() {});

我同时用于读取和写入值的对象映射器是:

private static final ObjectMapper om = new ObjectMapper();
static {
    om.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
    om.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    om.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, true);
    om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    om.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
}

我在发送者和接收者项目中都使用Jackson的1.6.3版本。该功能所需的版本为1.2+,因此我认为可能未在使用此版本,但是我的接收器是Spring应用程序,并且我检查了libs文件夹中安装的库为1.6.3。

我可能做错了什么?也许此功能不能用于地图。

我还有另一个问题,到目前为止,我只是发送一个映射,其中键只是一个uuid值,而值是一个数字。如果我发送带有ALLOW_UNQUOTED_FIELD_NAMES功能的特殊字符的值,可能会有任何问题吗?杰克逊会逃脱这个角色吗?

谢谢。


阅读 1399

收藏
2020-04-21

共1个答案

小编典典

似乎QUOTE_FIELD_NAMES在某些情况下,杰克逊(Jackson)会产生这样的输出,即使ALLOW_UNQUOTED_FIELD_NAMES打开也无法读取自身。你可能需要为JsonParser非标准输入解析实现定制。

问题在于你正在生成非标准的JSON,并且不能保证客户端会正确处理它。但是,如果你不将其公开到你的应用程序之外并且非常关心大小,则可以解析/生成二进制格式,例如Jackson的Smile。

2020-04-21