Изменить десериализованный тип рекурсивной конкретной карты Scala 2.11 в Джексоне - PullRequest
0 голосов
/ 02 января 2019

Моя цель - прочитать и выполнить итерацию по вложенным картам JSON в том же порядке, в котором они появились в исходном файле JSON.Например, с JSON, например

{'nested': {'key2': 2, 'key1': 1}}

Я хочу иметь возможность выполнять итерациюповерх «вложенной» карты в том же порядке ключи появились в исходном JSON.

Привязки Jackson Scala по умолчанию используют Map1-Map4 для 1-4 ключей и HashTrieMap для 5 или более ключей.Я хотел бы использовать 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 class scala.collection.immutable.HashMap $ HashTrieMap Map (val1-> 1, val3 -> 17, val21 -> hello21, val2 -> hello2, val0 -> hello0)

, который не является ни ListMap, ни исходным порядком JSON.В настоящее время я использую Jackson 2.9.6, но с удовольствием меняю версии, если это необходимо для получения желаемого эффекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...