【问题标题】:Jackson json deserialization into Seq[Double] but getting Integers instead of DoublesJackson json 反序列化为 Seq[Double] 但得到整数而不是双精度
【发布时间】:2018-11-01 12:19:45
【问题描述】:

我想使用 Jackson 从 json 反序列化以获取 Seq[Double]。但是json可以编辑,小数点可能会丢失。所以我想将"list":[1,2.0] 反序列化为Seq(1.0,2.0),但杰克逊会给我一个破碎的列表,第一项是Integer,第二项是Double

例外是:

java.lang.ClassCastException: java.lang.Integer 无法转换为 java.lang.Double at

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

我可以告诉 Jackson 将字符串 "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
  }
}

【问题讨论】:

标签: json scala jackson deserialization


【解决方案1】:

似乎jakson 无法很好地解析ListSeq

对于您的情况,使用Array 而不是ListSeq 进行以下修改后,代码运行良好:

// line 6: List --> Array
case class SomeDoubles(a: Double, list: Array[Double])

// line 14:
val test = SomeDoubles(1.0, Array(1.0, 2.0))

【讨论】:

    【解决方案2】:

    我遇到了同样的问题

    试试case class SomeDoubles(a: java.lang.Double, list: Seq[java.lang.Double])

    如果需要,在反序列化后返回 scala Double,例如 .map(_.toDouble)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2016-02-18
      相关资源
      最近更新 更多