我们最近从Jerkson切换到json4s,我们很快发现这两个库的默认反序列化行为很不相同。

我们遇到的问题之一是,有时我们会收到json输入,其中数字字段表示为字符串而不是数字

//example json object with string representation of "id"
{
    "id" : "12545"
}


//example json object with number representation of "id"
{
    "id" : 12345
}

这些需要反序列化为以下类
case class example(id:Int)

这是将json反序列化为任意类的常规设置
import org.json4s.native.Serialization._
import org.json4s._
import org.json4s.native.JsonMethods._

object Json {
    implicit val formats = DefaultFormats
    def parse[T](json:String)(implicit mf: Manifest[T]):T =  {
        org.json4s.native.JsonMethods.parse(input).extract[T]
    }
}

但是,每当我们尝试使用ID的字符串表示形式解析json对象时,都会抛出该异常并显示消息异常:

报价无可用值id无可用值不知道如何
将JString(12545)转换为int

我一直在寻找一种为Integer字段设置自定义阅读器的方法,该方法试图将字符串解析为Integers,但是我还没有找到一种涵盖我们用例的解决方案。我们需要的是一种通用的全能解决方案,以支持旧版应用程序。

有人知道如何实现这一目标吗?

最佳答案

谢谢,我最终得到了这个序列化器对象:

object StringToLong extends CustomSerializer[Long](format => ({ case JString(x) => x.toLong }, { case x: Long => JInt(x) }))
implicit val formats = DefaultFormats + StringToLong

10-08 18:56