【发布时间】:2019-01-20 09:59:50
【问题描述】:
我正在尝试使用 Jackson ObjectMapper 将 Scala 类序列化/反序列化为 JSON。序列化工作正常,但我在尝试重新读取 JSON 时遇到类型异常。我通过添加适当的注释修复了大多数异常,但它不适用于我的 Map 成员......似乎杰克逊正在尝试处理键在 JSON 对象中作为类中的属性而不是映射中的键。 (我相信这与其他类似的问题不同,因为他们直接在地图内容上调用readValue。)
这是我的 ObjectMapper 设置:
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
这是我带注释的类和成员的样子:
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
class MyClass extends Serializable {
@JsonDeserialize(
as = classOf[mutable.HashMap[String, Long]],
keyAs = classOf[java.lang.String],
contentAs = classOf[java.lang.Long]
)
val counts = mutable.Map.empty[String, Long]
}
如果我给它一些 JSON,例如:
{"counts":{"foo":1,"bar":2}}
然后用mapper.readValue[MyClass](jsonString)阅读它
我得到了一个像UnrecognizedPropertyException: Unrecognized field "foo" (class mutable.HashMap), not marked as ignorable 这样的异常。
我尝试将 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 添加到我的映射器配置中,但在这种情况下似乎没有任何作用,而且我不确定这种全局设置是否可取。
如何说服 Jackson 将字符串“foo”和“bar”视为映射成员字段中的键,而不是 HashMap 类中的属性?它似乎做了正确的事情,自动把它写出来。
另外值得注意的是:反序列化在对临时文件或字符串变量的快速输出/输入单元测试中似乎可以正常工作,但当我尝试运行整个应用程序并且它读取之前编写的 JSON 时却不行。我不知道为什么它似乎在测试中起作用,据我所知,它正在拨打相同的readValue 电话。
【问题讨论】: