在杰克逊中更改反序列化的Scala 2.11递归具体地图类型

时间:2019-01-02 03:36:55

标签: json scala dictionary jackson

我的目标是按照嵌套JSON映射在源JSON中出现的顺序来读取和迭代。例如,使用JSON

  

{'嵌套':{'key2':2,'key1':1}}

我希望能够以键在源JSON中出现的相同顺序遍历“嵌套”地图。

默认的Jackson Scala绑定对1-4个键使用Map1-Map4,对5个或更多键使用HashTrieMap。我想将ListMap用作具体的Map实现,以(希望)保持键顺序。似乎有很多建议(SimpleModule.addAbstractTypeMapping,SimpleAbstractTypeResolver.addMapping等),但我一直无法使它们起作用。我当前的代码是

    val module = new SimpleModule
    module.addAbstractTypeMapping(classOf[Map[_, _]], classOf[ListMap[_, _]])
    val mapper = new ObjectMapper()  with ScalaObjectMapper
    mapper.registerModule(DefaultScalaModule)
    mapper.registerModule(module)
    val json = """{
      "inside" : {
      "val1" : 1,
      "val3" : "17",
      "val2" : "hello2",
      "val0" : "hello0",
      "val21" : "hello21"
    }}"""

    val parsed = mapper.readValue[Map[String, Any]](json)
    println(parsed.getClass)
    parsed.get("inside") match {
      case Some(l) => {println(l.getClass); println(l)}
      case None => println("none")
    }

产生输出

  

scala.collection.immutable.Map $ Map1类   scala.collection.immutable.HashMap $ HashTrieMap类   Map(val1-> 1,val3-> 17,val21-> hello21,val2-> hello2,val0-> hello0)

既不是ListMap也不是原始JSON顺序。我目前正在使用Jackson 2.9.6,但很高兴根据需要更改版本以达到理想的效果。

0 个答案:

没有答案