[英]Serialize and Deserialize scala enumerations or case objects using json4s
假设我有一组枚举或密封的case对象,如下所示:
sealed abstract class Status
case object Complete extends Status
case object Failed extends Status
case object Pending extends Status
case object Unknown extends Status
要么
object Status extends Enumeration {
val Complete, Failed, Pending, Unknown = Value
}
为它们创建json格式的最简单方法是什么,这样我就可以非常轻松地(以编程方式)生成json格式,以供自定义JsonFormat
工厂方法使用,例如以下方法,该方法适用于所有普通的case类,字符串,集合等。 。,但为以上两种枚举类型生成{}
或{"name": null}
?:
import org.json4s.DefaultFormats
import org.json4s.jackson.JsonMethods.parse
import org.json4s.jackson.Serialization
import org.json4s.jvalue2extractable
import org.json4s.string2JsonInput
trait JsonFormat[T] {
def read(json: String): T
def write(t: T): String
}
object JsonFormat {
implicit lazy val formats = DefaultFormats
def create[T <: AnyRef: Manifest](): JsonFormat[T] = new JsonFormat[T] {
def read(json: String): T = parse(json).extract[T]
def write(t: T): String = Serialization.write(t)
}
}
我们使用org.json4s.ext.EnumNameSerializer
序列化枚举:
import org.json4s._
import org.json4s.ext.EnumNameSerializer
class DoesSomething {
implicit lazy val formats = DefaultFormats + new EnumNameSerializer(Status)
...stuff requiring serialization or deserialization...
}
在实践中,我们具有mixin特性,它添加了隐式格式并定义了所有自定义序列化器/解串器:
trait OurFormaters extends Json4sJacksonSupport {
implicit lazy val json4sJacksonFormats:Formats = DefaultFormats +
UuidSerializer +
new EnumNameSerializer(Status) +
...
}
object UuidSerializer extends CustomSerializer[UUID](format =>
(
{
case JString(s) => UUID.fromString(s)
case JNull => null
},
{
case x: UUID => JString(x.toString)
}
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.