首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用json4s序列化可选值类实例时出现问题

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

Stack Overflow用户
提问于 2019-09-03 01:04:43
回答 2查看 488关注 0票数 3

我正在尝试使用json4s将一个带有可选值类字段的case类序列化为JSON。到目前为止,我还不能正确地呈现可选的value-class字段(参见下面的示例片段)。

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

下面是一个简短的自包含测试

代码语言:javascript
复制
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版本:

代码语言:javascript
复制
    "org.json4s" %% "json4s-native" % "3.6.7"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-03 01:53:31

它看起来很像this的问题,似乎没有修复或评论。

定制的串行化程序可以节省您的时间。

代码语言:javascript
复制
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)))
票数 3
EN

Stack Overflow用户

发布于 2019-09-03 13:39:33

在任何情况下,请尝试使用其他选项,如使用jsoniter-scala。它比json4s有更多的safeefficient,特别是在美化的JSON的序列化方面。

添加/替换依赖项:

代码语言:javascript
复制
libraryDependencies ++= Seq(
  "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core"   % "0.55.2" % Compile,
  "com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "0.55.2" % Provided // required only in compile-time
)

派生顶级数据结构的编解码器,并使用它将其序列化为字符串:

代码语言:javascript
复制
import com.github.plokhotnyuk.jsoniter_scala.macros._
import com.github.plokhotnyuk.jsoniter_scala.core._

case class Id(value: Int) extends AnyVal

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

implicit val codec: JsonValueCodec[Foo] = JsonCodecMaker.make(CodecMakerConfig())

val json = writeToString(Foo(Option(Id(123)), "foo-name", Option("foo-opt"), Id(321)), WriterConfig(indentionStep = 2))
val correct =
  """{
    |  "id": 123,
    |  "name": "foo-name",
    |  "optField": "foo-opt",
    |  "nonOptId": 321
    |}""".stripMargin
assert(json == correct)

还有更有效的方法可以立即存储到字节数组、java.nio.ByteBuffer或java.io.OutputStream中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57760588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档