java - 递归类型转换jackson json解析器

标签 java json scala jackson

我正在使用 Jackson 将 json 字符串解析为 scala 案例类实例。 这是我的代码

import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import scala.reflect.{ClassTag, _}

object JsonUtil {
  val jacksonMapper = new ObjectMapper()
  jacksonMapper.registerModule(DefaultScalaModule)
  jacksonMapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, false)
  jacksonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

  def toJson(value: Map[Symbol, Any]): String = {
    toJson(value map { case (k,v) => k.name -> v})
  }

  def toJson(value: Any): String = {
    jacksonMapper.writeValueAsString(value)
  }

  def fromJson[T: ClassTag](json: String): T = {
    jacksonMapper.readValue[T](json, classTag[T].runtimeClass.asInstanceOf[Class[T]])
  }
}

这是json解析错误

case class Person(name: String, age: Long, score: List[Long])
val person = JsonUtil.fromJson[Person]("""{"name": 123654,"age":23, "score": [6,7,9]}""")
person.name
person.score
person.score.head
res0: String = 123654
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    at scala.runtime.BoxesRunTime.unboxToLong(ws.sc93376:101)
    at #worksheet#.#worksheet#(ws.sc93376:35)

我知道 Jackson 足够聪明,可以在数字类型、字符串到数字之间进行转换,反之亦然,但似乎它只适用于非集合情况。

我怎样才能做得更好,迫使 jackson 递归地转换集合内的类型?

最佳答案

您必须在score: List[Long]之前添加此注释:

@JsonDeserialize(contentAs = classOf[java.lang.Long])

来源:https://github.com/FasterXML/jackson-module-scala/wiki/FAQ

关于java - 递归类型转换jackson json解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46294718/

相关文章:

java - 是什么导致了 java.util.HashSet 和 HashMap.keySet() 类的 iterator() 排序有点不可预测?

json - postman - 发布应用程序/json 数据

scala - 在 Scalaz 状态单子(monad)中查找 Shapeless HList 的类型类实例

java - 为什么 start-all.sh 的根本原因是 "failed to launch org.apache.spark.deploy.master.Master: JAVA_HOME is not set"?

javascript - 我有一个 php 文件,它提供 JSON 输出,并希望在 D3 中使用该 JSON

scala - Intellij Idea - Scala 使用什么配置

java - 在等待来自客户端的 channel.basicAck 时, channel 可以保持 Activity 状态多长时间

java - 仅显示最大数字,而我想打印两个整数之间的所有数字

java - Spring Boot - 无法解决 Whitelabel 错误页面

java - 如何从 php 文件获取变量并在 Android Activity 中使用它?