反序列化JSON以将[String,SomeJavaObject]映射到Spring、Scala和Jackson
我刚刚开始尝试Scala,并尝试在现有的Java/Spring应用程序中使用它,该应用程序包含Jackson 2.3.1和Jackson模块Scala 我正在尝试反序列化JSON,例如以下内容,以反序列化JSON以将[String,SomeJavaObject]映射到Spring、Scala和Jackson,java,json,spring,scala,jackson,Java,Json,Spring,Scala,Jackson,我刚刚开始尝试Scala,并尝试在现有的Java/Spring应用程序中使用它,该应用程序包含Jackson 2.3.1和Jackson模块Scala 我正在尝试反序列化JSON,例如以下内容,以String到Color对象的Map结束,但当我运行下面的代码时,我以String到Map结束: { "1A-X": { "c": 0, "m": 0, "y": 0, "k": 0, "r": 255, "g": 255, "b": 255
String
到Color
对象的Map
结束,但当我运行下面的代码时,我以String
到Map
结束:
{
"1A-X": {
"c": 0,
"m": 0,
"y": 0,
"k": 0,
"r": 255,
"g": 255,
"b": 255
}
}
为什么生成的贴图的值是另一个贴图而不是颜色对象?
Color
是一个现有的Java类,带有@JsonCreator
注释构造函数
@RequestMapping(Array("/swatches"))
def setSwatches(@RequestBody swatches: Map[String, Color]) = {
println(swatches)
println("Map class " + swatches.getClass + ", key class " + swatches.get("1A-X").get.getClass)
}
将上述JSON传递给此代码的输出如下:
Map(1A-X -> Map(y -> 1, m -> 1, b -> 51, g -> 1, c -> 1, r -> 5, k -> 1))
Map class class scala.collection.immutable.Map$Map1, key class class scala.collection.immutable.HashMap$HashTrieMap
如果我只是直接传入一个颜色,而没有将代码传递到颜色映射,那么反序列化的效果与预期的一样
请让我知道如何直接反序列化以成功映射[字符串,颜色]
更多细节
Color.java
这个问题的根本原因似乎不是Scala特有的,尽管Scala模块目前不支持解决这个问题的方法 关于这个主题还有一个问题,表明Spring在反序列化泛型类型时没有向Jackson提供完全指定的类型信息;Spring实际上是在告诉Jackson反序列化一个
映射[\u,\u]
此处和其他地方提到的解决方法是创建所需类型的派生类,并将其用作方法参数:
class ColorMap extends java.util.HashMap[String,Color]
@RequestMapping(Array("/swatches"))
def setSwatches(@RequestBody swatches: ColorMap) = ...
这适用于Java集合,但事实证明Scala模块不正确支持此用例。此缺陷跟踪为
在Scala模块实现奇偶校验之前,或者在Spring纠正其类型传播之前,您将需要使用Java集合的派生类,如上所述。这里没有足够的信息。
Color
类是什么样子的?当您“将颜色
直接传入”(有效的用例)时,JSON看起来是什么样子的?谢谢Christopher。我在上面添加了Color.java的代码。我在尝试绑定到ListMap时也遇到了一些问题(试图维护CMYKRGB键的顺序),因此我遇到的问题可能与我的Java颜色类无关。
{
"c": 0,
"m": 0,
"y": 0,
"k": 0,
"r": 255,
"g": 255,
"b": 255
}
class ColorMap extends java.util.HashMap[String,Color]
@RequestMapping(Array("/swatches"))
def setSwatches(@RequestBody swatches: ColorMap) = ...