当前位置: 首页 > 面试题库 >

jackon JSON库中的ALLOW_UNQUOTED_FIELD_NAMES

袁奇逸
2023-03-14
问题内容

我正在使用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。参见http://www.cowtowncoder.com/blog/archives/2010/09/entry_418.html(2.4)。



 类似资料:
  • 问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)

  • 我在Android中的Proguard文件有一个错误。 -加注-加注-加注-加注-加注-加注 -libraryjars/home/jorider/wul4/adt-android/sdk/platforms/android-17/android.jar-libraryjars/home/jorider/wul4/adt-android/sdk/extras/android/support/v4/a

  • 我用OpenCV编写了一个简单的应用程序。我把所有的jar文件放在/usr/local/hadoop/lib文件夹中。在运行hadoop作业时,我收到以下错误:

  • 问题内容: 在Java中是否有任何可阻止的库! 问题答案: 在其网站上有Porter的词干提取器的实现。该代码不是Java风格的代码,但是它可以实现预期的功能,而且它只是一个类。

  • 问题内容: 是否可以使用Go创建共享库(.so)? 更新 :为此创建了一个“ 问题 ”。 问题答案: 现在可以使用标志 您需要做的是首先运行以下命令: (以上代码使所有通用软件包都可共享!)然后 最后,在编译代码时,您需要运行: 上面这些就是什么,而不是静态链接所有内容而仅动态链接它们,您最终将获得更小的编译文件。为了让您了解我的带有静态链接的“ hello.go”文件为2.3MB,而使用动态链接

  • 好的,这是我们得到的: 我们有两个库包,我们已经将它们编译成JAR。 我们用 而且 给我们装进罐子里。 现在我们想将这两个罐子包含到另一个Java项目中。 所以我们有 /project/src/a_pack/helloworld. /project/libs/starwars.jar /project/libs/barwars.jar /project/manifest.txt MANIFEST.