【问题标题】:Can't get json4s to render my case class?无法让 json4s 呈现我的案例类?
【发布时间】:2019-05-23 19:05:26
【问题描述】:

我设置了一个 SBT 控制台,例如...

import org.json4s._
import org.json4s.native.JsonMethods._
import org.json4s.JsonDSL._
case class TagOptionOrNull(tag: String, optionUuid: Option[java.util.UUID], uuid: java.util.UUID)
val t1 = new TagOptionOrNull("t1", Some(java.util.UUID.randomUUID), java.util.UUID.randomUUID)
val t2 = new TagOptionOrNull("t2", None, null)

我正在尝试查看 json4s 围绕 null 与 Option[UUID] 的行为。但我无法弄清楚调用它来使我的案例类成为 JSON 的字符串。

scala> implicit val formats = DefaultFormats
formats: org.json4s.DefaultFormats.type = org.json4s.DefaultFormats$@614275d5

scala> compact(render(t1))
<console>:23: error: type mismatch;
 found   : TagOptionOrNull
 required: org.json4s.JValue
    (which expands to)  org.json4s.JsonAST.JValue
       compact(render(t1))

我错过了什么?

【问题讨论】:

    标签: scala json4s


    【解决方案1】:

    Serialization.write 应该能够像这样序列化案例类

    import org.json4s.native.Serialization.write
    implicit val formats = DefaultFormats ++ JavaTypesSerializers.all
    println(write(t1))
    

    应该输出哪个

    {"tag":"t1","optionUuid":"95645021-f60c-4708-8bf3-9d5609559fdb","uuid":"19cc4979-5836-4edf-aedd-dcb3e96f17d6"}
    

    注意序列化UUID,我们需要来自

    JavaTypeSerializers格式
    libraryDependencies += "org.json4s" %% "json4s-ext" % version
    

    【讨论】:

    • 效果很好,马里奥。但现在我不知道renderwrite 之间的区别(除了render 不适用于我的简单用例)。 render 只适用于那些 DSL 的东西?
    • render 采用 JValue 不是案例类。令人困惑的是,render 似乎采用原始值,例如render(List(1,2)),但是这个参数使用seq2jvalue 隐式转换为JValue。对于案例类,我认为我们需要write
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多