假设我有一个枚举或密封的案例对象组,如下所示:
sealed abstract class Status
case object Complete extends Status
case object Failed extends Status
case object Pending extends Status
case object Unknown extends Status
Run Code Online (Sandbox Code Playgroud)
要么
object Status extends Enumeration {
val Complete, Failed, Pending, Unknown = Value
}
Run Code Online (Sandbox Code Playgroud)
为这些创建json格式的最简单方法是什么,以便我可以非常容易地(以编程方式)生成json格式,以便在自定义JsonFormat
工厂方法中使用,例如以下内容,适用于所有正常的案例类,字符串,集合等. ,但产生{}
或{"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)
}
}
Run Code Online (Sandbox Code Playgroud)
小智 20
我们习惯于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...
}
Run Code Online (Sandbox Code Playgroud)
在实践中,我们有mixin trait,它添加了隐式格式并定义了我们所有的自定义序列化器/解析器:
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)
}
)
)
Run Code Online (Sandbox Code Playgroud)