使用json4s对嵌套对象进行自定义JSON序列化

时间:2018-11-24 16:51:33

标签: json scala serialization json4s

我具有以下结构:

    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自定义序列化器(我的实现)的帮助下序列化非类

    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}
    }
  }
}

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

我们将不胜感激。

我已经更新NotSerializer课程-case bE:BooleanExpression部分。

1 个答案:

答案 0 :(得分:0)

您需要序列化包含的表达式,而不是序列化值。因此,请勿创建JBool-而是调用Extraction.decompose-不要调用.value,因为那样会计算布尔表达式。