scala - 使用 json4s 序列化可选值类实例时出现问题

标签 scala json4s scala-option value-class

我正在尝试使用 json4s 将带有可选值类字段的案例类序列化为 JSON。到目前为止,我无法正确呈现可选的值类字段(请参阅下面的示例片段)。

我尝试了 json-nativejson-jackson 库,结果是一样的。

这是一个简短的独立测试

import org.json4s.DefaultFormats
import org.scalatest.FunSuite
import org.json4s.native.Serialization._

class JsonConversionsTest extends FunSuite {
  implicit val jsonFormats = DefaultFormats

  test("optional value-class instance conversion") {
    val json = writePretty(Foo(Option(Id(123)), "foo-name", Option("foo-opt"), Id(321)))

    val actual =
      """
        |{
        |  "id":{
        |    "value":123
        |  },
        |  "name":"foo-name",
        |  "optField":"foo-opt",
        |  "nonOptId":321
        |}
        |""".stripMargin.trim

    assert(json === actual)

    val correct =
      """
        |{
        |  "id": 123,
        |  "name":"foo-name",
        |  "optField":"foo-opt",
        |  "nonOptId":321
        |}
        |""".stripMargin.trim

    assert(json !== correct)
  }

}

case class Id(value: Int) extends AnyVal

case class Foo(id: Option[Id], name: String, optField: Option[String], nonOptId: Id)

我正在使用 scala 2.12 和最新的 json4s-native 版本:

    "org.json4s" %% "json4s-native" % "3.6.7"

最佳答案

看起来很像this问题,似乎没有得到解决或评论。

自定义序列化程序可以节省您的时间。

object IdSerializer extends CustomSerializer[Id] ( format => (
  { case JInt(a)  => Id(a.toInt) },
  { case a: Id => JInt(a.value) }
))
implicit val formats = DefaultFormats + IdSerializer
val json = writePretty(Foo(Option(Id(123)), "foo-name", Option("foo-opt"), Id(321)))

关于scala - 使用 json4s 序列化可选值类实例时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57760588/

相关文章:

scala - 是否可以将 json4s 3.2.11 与 Spark 1.3.0 一起使用?

scala - 如何产生多个值?

scala - 如何从 Scala 调用重载的 Java 可变参数方法?

ruby - 如果 Java 人去 Scala,C# 去 F#,那么 Ruby 人去哪里寻求函数式涅槃?

scala - 将 Scala 类型传递给函数

java - scala -> java getField().get()

java - JodaTime 序列化问题

json4s - json4s中是否有针对UUID的开箱即用的(反)序列化器?

scala - 为什么 Some(null) 不被视为 None?

Scala:类似 Option (Some, None) 但具有三种状态:Some、None、Unknown