gpt4 book ai didi

json - 存储案例对象时使用哪个 JSON 库?

转载 作者:行者123 更新时间:2023-12-01 06:22:50 26 4
gpt4 key购买 nike

我需要将 akka 事件序列化为 json。基于
"What JSON library to use in Scala? "我尝试了几个库。由于我的序列化程序应该对我的所有具体事件一无所知,因此应该使用反射来序列化由案例类和案例对象组成的事件。 json4s似乎最符合我的要求。

class Json4sEventAdapter(system: ExtendedActorSystem) extends EventAdapter {
implicit val formats = Serialization.formats(FullTypeHints(List(classOf[Evt])))
override def toJournal(event: Any): Any = event match {
case e: AnyRef =>
write(e).getBytes(Charsets.UTF_8)}

override def fromJournal(event: Any, manifest: String): EventSeq = event match {
case e: Array[Byte] => {
EventSeq.single(read[Evt](new String(e.map(_.toChar))))}}

使用 json4s 的问题是,无论使用哪种实现 Deserialization of objects produces different instances .
由于我们大量使用 case 对象的模式匹配,这破坏了我们现有的所有代码。

所以我的问题是:在存储 case 对象时,哪个 JSON 库可以与 scala 和 akka 持久性一起使用?

甚至有一个库可以正确地通过反射处理案例对象的反序列化吗? - 或者有没有人有好的解决方法?

最佳答案

我无法评论 Json4s,因为我从未使用过它,但我知道这在 play-json 中不是问题.你会做这样的事情:

import play.api.libs.json._

sealed trait MyEventBase
case object MyEvent extends MyEventBase

implicit val myEventBaseFormat: Format[MyEventBase] = Format(Reads.StringReads.collect(ValidationError("must be the string `MyEvent`") {
case "MyEvent" => MyEvent
}, Writes.pure("MyEvent"))

在这种情况下,序列化是一个裸字符串,所以我捎带内置 StringReads断言该项目应可反序列化为字符串,然后使用 collect将其缩小到特定字符串。但基本思想是您在 Reads 中提供想要从反序列化返回的特定值。实例。在这里,它是单例 case object .因此,无论何时反序列化 MyEventBase导致 MyEvent ,你肯定会得到同样的实例。

在现实世界中, MyEventBase可能还有其他子类型,因此您可以构建 Writes实例来创建某种形式的用于序列化的类型标记,您的 Reads实例可以关闭以反序列化为正确的子类型。就像,您可能会序列化为 JSON 对象而不是裸字符串,并且该对象将具有 type标识子类型的字段。或者只是使用类似 Play JSON Extensions 的东西自动合成合理 Format为您 sealed trait .

关于json - 存储案例对象时使用哪个 JSON 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31652952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com