首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >case对象的lift-json序列化

case对象的lift-json序列化
EN

Stack Overflow用户
提问于 2014-02-18 00:19:26
回答 2查看 360关注 0票数 0

我想为JSON序列化定义一个类,如下所示:

代码语言:javascript
复制
case class Foo(id: String, variety: Variety)

sealed trait Variety
case object Bar extends Variety { override def toString = "1" }
case object Baz extends Variety { override def toString = "2" }

它应该像这样序列化和反序列化:

代码语言:javascript
复制
write[Foo](Foo("foo1", Bar))
"""{"id":"foo1", "variety":"1"}"""

read[Foo]("""{"id":"foo2", "variety":"2"}""")
Foo("foo2", Baz)

但是它序列化到{"id":"foo2", "variety":{}},并且不能反序列化。可以像这样使用case对象吗?我使用的是lift-json_2.10 2.6-M2?

有没有更好的方法来用lift-json处理枚举?

EN

回答 2

Stack Overflow用户

发布于 2014-04-10 17:44:15

不是case对象,而是使Variety成为case类,并使Bar/Baz val

票数 1
EN

Stack Overflow用户

发布于 2014-06-16 17:50:46

我使用以下类为case对象创建自定义序列化程序。如果您关心json的格式,只需选择适合您的情况的fieldKey和identifierOverride即可。

代码语言:javascript
复制
object SpecialObjectSerializers {
  val FieldKeyDefault = "scalaObject"

  class SingleObjectSerializer[T <: AnyRef](obj: T, FieldKey : String = FieldKeyDefault,
                                             identifierOverride : Option[JValue] = None) extends Serializer[T] {
    val Identifier = identifierOverride.getOrElse(JString(obj.getClass.getName))
    override def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
      case `obj` =>
        JObject(List(JField(FieldKey, Identifier)))
    }
    override def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), T] = {
      case (_, JObject(List(JField(FieldKey, Identifier)))) => obj
    }
  }

  class RichSerializer[T](serializer: Serializer[T]) {
    def +(that: Serializer[T]) = {
      new Serializer[T] {
        override def deserialize(implicit format: Formats) = serializer.deserialize.orElse(that.deserialize)
        override def serialize(implicit format: Formats) = serializer.serialize.orElse(that.serialize)
      }
    }
  }

  implicit def toRichSerializer[T](serializer: Serializer[T]) = new RichSerializer(serializer)

  def caseObjectsSerializer[T <: AnyRef](objs: T*): Serializer[T] = {
    val serializers: Seq[Serializer[T]] = objs.map(new SingleObjectSerializer(_))
    serializers.reduceLeft[Serializer[T]] {
      case (s1, s2) => s1 + s2
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21834096

复制
相关文章

相似问题

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