java - jackson JSON 库中的 ALLOW_UNQUOTED_FIELD_NAMES

标签 java json spring parsing jackson

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

org.codehaus.jackson.JsonParseException: Unexpected character ('9' (code 57)): was expecting either valid name character (for unquoted name) or double-quote (for quoted) to start field name at [Source: java.io.StringReader@1347d75; line: 1, column: 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。

我可能做错了什么?也许这个功能不能与 map 一起使用。

我还有一个问题,到目前为止,我只是发送了一个映射,其中键只是一个 uuid 值,而值是一个数字。如果我发送带有 ALLOW_UNQUOTED_FIELD_NAMES 功能的特殊字符的值,我会遇到什么问题吗? jackson 会逃脱这些角色吗?

谢谢。

最佳答案

好的,我认为 Pingw33n 的回答非常正确。所以:是的,您可以使用该功能;但它是相当启发式的——因为没有关于不带引号的名称应该如何工作的规范(毕竟,JSON 允许名称中的任何和所有字符!);或者,如果要使用任何转义机制,那么任何人都可以猜测应该写入或接受什么。

在这种特殊情况下,可能是“-”字符导致了问题。它不是 Javascript 名称的合法部分,这是 Jackson 使用的近似名称。

一种可能的解决方案是让 Jackson 转义属性名称中的此类字符(我不记得目前是如何完成的;如果引用了任何名称字符)。如果您能找出一个简单的测试用例,您可以在 Jackson Jira 提交 Jira 改进请求。添加转义(并确保解析器可以取消通常的反斜杠版本)。

关于java - jackson JSON 库中的 ALLOW_UNQUOTED_FIELD_NAMES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4815231/

相关文章:

java - 尝试将我的 GWT 项目拆分为多个模块 - "did you forget to inherit a required module?"

java - 通过gson将复杂的json对象转换为java对象

java - Spring Security 用户身份验证不起作用

java - 在 Akka 中对一对外部服务调用进行排序的最佳方法

spring - 如何让 Maven 打印出失败的测试名称?

java - Firebase 身份验证失败

java - 使用 Hibernate 请求和分页多个不相关的实体类型

json - SwiftyJSON - 无法解析 Json

java - 如何查询指定日期起连续6天的情况?

PHP 使用 json_encode 传递 Javascript 时间戳