我正在使用 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/