【发布时间】:2011-01-27 10:34:49
【问题描述】:
我正在使用 jackson 库对 JSON 进行序列化/反序列化。我需要这个 JSON 的大小尽可能小,所以我启用了 ALLOW_UNQUOTED_FIELD_NAMES 功能来消除所有引号。我知道去掉引号不是标准的 json,但是让 json 变小是项目的硬性要求。生成的 json 可以工作,但是当我尝试读取 json 值时出现异常:
org.codehaus.jackson.JsonParseException: 意外字符('9'(代码 57)): 期待任何一个有效的名字 字符(用于未引用的名称)或 双引号(用于引用)开始 [来源: java.io.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 功能的特殊字符的值,我会遇到什么问题吗?杰克逊会逃脱这些角色吗?
谢谢。
【问题讨论】:
标签: java json spring parsing jackson