json - Jackson Scala 模块,嵌套列表和 map

标签 json scala nested jackson

我希望转换 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/

相关文章:

json - Grails 无法将 JSON 数组转换为 HashMap

javascript - 从数组中添加 json 键

javascript - json 作为对象而不是字符串出现

scala - 柯里化(Currying)和高阶函数之间的区别

scala - HiveContext 未读取 Orcfile 的模式

firebase - AngularFire2 在数组中嵌套 *ngFor 数组...但 Firebase 没有数组...?

ios - 从嵌套 NSDictionary 读取值

android - 使用 Retrofit Library 获取数据时如何处理 JSON 中丢失的键 android

scala - 如何在 Scala 中将字符串列表转换为另一种形式?

java - 在 Java 中的同一类的另一个方法中使用一个方法