我的目标是按照嵌套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,但很高兴根据需要更改版本以达到理想的效果。