Джексон JSON десериализации в Seq [Double], но получает целые числа вместо двойных - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу десериализовать из json, используя Джексона, чтобы получить Seq[Double]. Но JSON может быть отредактирован и десятичная точка может отсутствовать. Поэтому я хочу десериализовать "list":[1,2.0] в Seq(1.0,2.0), но Джексон выдаст мне неработающий список с первым элементом Integer и вторым Double.

Исключение составляло:

java.lang.ClassCastException: java.lang.Integer не может быть приведен к java.lang. Двухместный на

scala.runtime.BoxesRunTime.unboxToDouble (BoxesRunTime.java:114)

Могу ли я попросить Джексона прочитать строку "1" как Double вместо Integer?

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

case class SomeDoubles(a: Double, list: Seq[Double])

object TestJackson {
  val jacksonMapper = new ObjectMapper() with ScalaObjectMapper
  jacksonMapper.registerModule(new DefaultScalaModule)
  jacksonMapper.registerModule(new SimpleModule)

  def main(args: Array[String]): Unit = {
    val test = SomeDoubles(1.0, Seq(1.0, 2.0))

    println(jacksonMapper.writeValueAsString(test)) // {"a":1.0,"list":[1.0,2.0]}

    val json = """{"a":1,"list":[1,2.0]}""" // changing value 1.0 into 1

    val test2 = jacksonMapper.readValue[SomeDoubles](json) // it deserializes list into Integer and Double
    println(test2) // SomeDoubles(1.0,List(1, 2.0)) ... so the first item in list is already Integer and not Double
    val aValue = test2.a
    println(aValue) // 1.0
    val firstListedValue = test2.list.head
    println(firstListedValue) // Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...