【问题标题】:Custom JSON serialization of nested objects with json4s [duplicate]使用 json4s 对嵌套对象进行自定义 JSON 序列化 [重复]
【发布时间】:2019-04-26 20:57:03
【问题描述】:

我有以下结构:

    sealed trait BooleanExpression extends Serializable {
        def value: Boolean
    }

    case object True extends BooleanExpression with Serializable {
      val value: Boolean = true
    }

    case object False extends BooleanExpression with Serializable {
      val value: Boolean = false
    }

    case class Not(e: BooleanExpression) extends BooleanExpression with Serializable {
      val value = !e.value
    }

我想在 Json4s 自定义序列化器(我的实现)的帮助下序列化 Not 类

    object NotSerializer extends CustomSerializer[Not](format => ( {
         //deserialize      
         case JObject(
          JField("e", null) ::
            Nil
          ) => Not(null)
        }, {
          //serialize
          case not: Not => JObject(
              JField("not", JBool(not.e.value))
              )
        }))

主类如下:

object Main extends App {
  implicit val formats: Formats = Serialization.formats(NoTypeHints) + NotSerializer

  val not = Not(Not(Not(False)))

  println(writePretty(not))
}

类序列化如下:

    {
      "not" : true
    }

我期待看到的是:

{
  "not" : {
    "not" : {
      "not" : {true}
    }
  }
}

找不到错误。我究竟做错了什么?

非常感谢您的帮助。

我已更新NotSerializerclass - case bE:BooleanExpression 部分。

【问题讨论】:

  • 您的代码没有意义。您不是在序列化布尔值,而是在序列化布尔表达式。所以你不应该把它转换成布尔值。您确定这是您的代码的最新版本吗?
  • @RobinGreen 是的,你是对的。我已经上传了我的代码的最新版本。删除了转换为布尔值,但现在我得到了另一个输出。我已经更新了问题

标签: json scala serialization json4s


【解决方案1】:

您需要序列化包含的表达式,而不是序列化值。所以不要创建JBool - 而是调用Extraction.decompose - 并且不要调用.value,因为它会计算布尔表达式。

【讨论】: