我希望转换 json 对象列表,这些对象本身可能包含 Json 对象或 Json 对象列表,并且希望结果是适当的 Scala 映射或列表,但是,我只能将顶级对象转换为 map 或列表。
有没有一种简单的方法可以做到这一点?
例如在 REPL
objectMapper.readValue("{\"test\":\"113123\",\"myList\":[{\"test2\":\"321323\"},{\"test3\":\"11122\"}]}", classOf[Map[String,Any]])
将返回
res: Map[String,Any] = Map(test -> 113123, myList -> [{test2=321323}, {test3=11122}])
我想要的地方
res: Map[String,Any] = Map(test -> 113123, myList -> List(Map(test2 -> 321323), Map(test3 -> 111222)))
最佳答案
好的,所以使用更高版本的 scala jackson 模块我创建了这个类
private class NestedTypeObjectDeserializer extends JacksonUntypedObjectDeserializer {
override def mapArray(jp: JsonParser, ctxt: DeserializationContext): AnyRef =
super.mapArray(jp, ctxt).asInstanceOf[ArrayList[AnyRef]].asScala.toList
override def mapObject(jp: JsonParser, ctxt: DeserializationContext): AnyRef =
super.mapObject(jp, ctxt).asInstanceOf[LinkedHashMap[String, AnyRef]].asScala.toMap
}
private object NestedTypeObjectDeserializerResolver extends Deserializers.Base {
lazy val OBJECT = classOf[AnyRef]
override def findBeanDeserializer(javaType: JavaType,
config: DeserializationConfig,
beanDesc: BeanDescription) =
if (!OBJECT.equals(javaType.getRawClass)) null
else new NestedTypeObjectDeserializer
}
trait NestedTypeObjectDeserializerModule extends JacksonModule {
this += (_ addDeserializers NestedTypeObjectDeserializerResolver)
}
您可以将其应用于对象映射器
val objectMapper = new ObjectMapper()
val module = new OptionModule with MapModule with SeqModule with IteratorModule with NestedTypeObjectDeserializerModule {}
objectMapper.registerModule(module)
关于json - Jackson Scala 模块,嵌套列表和 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8792973/