jackon JSON库中的ALLOW_UNQUOTED_FIELD_NAMES
我正在使用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功能的特殊字符的值,可能会有任何问题吗?杰克逊会逃脱这个角色吗?
谢谢。
回答:
似乎QUOTE_FIELD_NAMES
在某些情况下,杰克逊(Jackson)会产生这样的输出,即使ALLOW_UNQUOTED_FIELD_NAMES
打开也无法读取自身。你可能需要为JsonParser
非标准输入解析实现定制。
问题在于你正在生成非标准的JSON,并且不能保证客户端会正确处理它。但是,如果你不将其公开到你的应用程序之外并且非常关心大小,则可以解析/生成二进制格式,例如Jackson的Smile。
以上是 jackon JSON库中的ALLOW_UNQUOTED_FIELD_NAMES 的全部内容, 来源链接: utcz.com/qa/432672.html