json - 如何使用 json4s 将 JString 转换为 Int

标签 json scala json4s

我们最近从 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 对象并带有消息的异常时:

No usable value for offers No usable value for id Do not know how to convert JString(12545) into int

我一直在寻找一种方法来为整数字段设置自定义阅读器,它会尝试将字符串解析为整数,但我还没有找到涵盖我们用例的解决方案。我们需要一个通用的包罗万象的解决方案来支持遗留应用程序。

有人知道如何实现吗?

最佳答案

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

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

关于json - 如何使用 json4s 将 JString 转换为 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27018532/

相关文章:

c# - 如何删除json中的附加键

scala - 如何从 sbt 命令行为 scalatest 设置系统属性

scala - json4s:将类型转换为 JValue

json - 如何在使用 Json4s 序列化期间重命名字段?

json - Postgresql 更新 JSON 列保留一些键值并将其他键值添加为空

java - 反序列化 JSON 请求中包含许多对象的列表期间的性能问题

scala - 'val'或'var',是可变的还是不变的?

java - 定义和引用在 Play 模板签名中绑定(bind)的泛型类型

json4s 无法使用 mixin 特征序列化案例类

ios - 如何使用带有可变键的 codable 解码 JSON?