使用 json4s 序列化和反序列化 scala 枚举或 case 对象

2024-03-06

假设我有一个枚举或密封的案例对象组,如下所示:

  sealed abstract class Status
  case object Complete extends Status
  case object Failed extends Status
  case object Pending extends Status
  case object Unknown extends Status

or

  object Status extends Enumeration {
    val Complete, Failed, Pending, Unknown = Value
  }

为这些创建 json 格式的最简单方法是什么,以便我可以非常轻松地(以编程方式)生成用于自定义的 json 格式JsonFormat工厂方法,如下所示,适用于所有正常情况下的类、字符串、集合等,但会产生{} or {"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)
    }
  )
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 json4s 序列化和反序列化 scala 枚举或 case 对象 的相关文章

随机推荐

  • 如何在Python中解决递归关系

    我正在尝试编写代码来给出递归关系的数值答案 该关系本身很简单 定义如下 变量 x 是一个整数 p i p i 2 2 p i 1 2 如果 i gt 0 且 i p 0 p 2 2 如果 i gt x 则 p i 1 这也在这段代码中 fr
  • 如何使用 NUnit 模拟属性?

    如何使用 NUnit 模拟属性 NOTE 我发现这个外围的嘲笑答案 https stackoverflow com questions 591174 how to mock the property which returns the li
  • 如何在 mongodb 中使用构面操作查找字段的不同值

    FilteredAccording 部分和categorizedBy 使用我在链接中提供的查询按预期工作 但我在 findDistinct 部分遇到问题 在 mongodb 中我有以下数据 id 10001 university SPYU
  • Jmeter JSR223 Sampler - 无法将数据写入 CSV 文件

    我正在使用 Jmeter v4 0 r1823414 根据这个答案 https stackoverflow com questions 50820389 unable to set incremental variable in jmete
  • 远程连接到 WebDev.WebServer.exe

    开发 ASP Net 网站 运行IE8 需要在IE6下测试网站 MultipleIE6 安装被 IE8 安装破坏 无法在文本框中输入 是的 我删除了缓存 是的 我重新注册了 dll 创建运行 IE6 的 VPC 无法连接到主机 WebDev
  • 如何防止结构体的默认构造函数被调用?

    有什么方法可以阻止调用结构体的默认构造函数吗 我的项目中有几个结构 其中一些结构在任何情况下都不能调用默认构造函数 这将导致我的代码中出现很多不需要的行为 PS 任何在编码时指示我某些特殊结构 无法使用默认构造函数实例化 被 错误 实例化的
  • finplot 作为布局中的小部件

    我正在尝试添加finplot https pypi org project finplot https pypi org project finplot 作为我的 UI 中布局之一的小部件 我创建了一个小部件finplot并将其添加到布局中
  • 访问 Jinja2 中的宏观上下文

    我想访问上下文函数内 jinja2 宏命名空间中的变量 假设我的宏看起来像 macro show var a show var context function a endmacro 我的上下文函数如下所示 contextfunction
  • 在 Yii2 中隐藏 URL 中的网页

    我已遵循中描述的答案这个问题 https stackoverflow com questions 27178364 yii 2 0 hiding basic web from the url along with the index php
  • C++ OutputIterator 后递增要求

    C 要求 OutputIterator 类型X支持形式的表达式r where r是一个实例X 此后缀增量在语义上必须等同于 X tmp r r return tmp 并且必须返回一个可转换为的类型X const 在 C 11 中 请参阅 2
  • 在 Visual Studio 中从包管理器控制台使用 git

    我正在尝试使用git从 Visual Studio 2010 中的包管理器控制台窗口 git命令按预期运行 与网络相关的命令除外 当我尝试时git push origin masterStudio 停止响应 代码已推送到 github co
  • Include() 然后包含() 在每个层次结构表策略中抛出“序列包含多个匹配元素”异常

    我正在使用 Entity Framework 7 和代码优先 并且我有一个涉及 3 个级别的父子关系的模型 Corporations have companies Companies属于一个corporation并有factories Fa
  • Q列出并删除

    我有一个QList带有指向类类型对象的指针Model 我想适当删除这个QList使用后 我知道 Qt 的哲学是避免 C 风格的内存管理 我如何delete this QList 你可以使用q删除全部 http qt project org
  • WPF ShowDialog 和 ElementHost

    是否可以从作为 ElementHost 子级的 WPF 用户控件显示模态窗口 并将模态窗口的所有者 父级设置为包含的 Form 控件 我猜您不能执行此操作 因为 Owner 属性采用 Window 的实例 而我想将其设置为 Element
  • 使用 UINavigatonController 有条件地跳过 iOS 5 应用程序中的 UIViewController

    在我们的 iOS 应用程序中 有三个UIViewController一个接着一个 我们想根据某些条件跳过中间的 直接从第一到第三 但是 用户应该能够通过第三个控制器上的 后退 按钮返回到第二个控制器 I tried self perform
  • 获取树枝模板文件中使用的所有变量[重复]

    这个问题在这里已经有答案了 是否可以获取树枝模板中使用的所有变量 例如 在模板上 ul for item in navigation li a href item caption a li endfor ul h1 My Webpage h
  • 从 Firefox 扩展设置 HTTP 标头

    如何在 Firefox 扩展中设置 HTTP 标头 我将做到这一点 以便这些仅在访问我的网站时发送 以便我可以检测插件是否已安装 如果安装了 则不会推广该插件 这是我发现的最紧凑的方法 Components classes mozilla
  • 我应该使用哪个移动开发开源框架? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的公司想开发一个移动应用程序 Web 应用程序 本机应用程序还是混合应用程序 他们其实不知道 在这种情况下 他们要求我对移动开发的开源框架 跨
  • 如何重置参数值以便代理可以再次请求参数?

    我创建了一个对话流代理和其中的多个意图 其中一种意图需要 2 个参数 账户和余额类型 然后 它发送 Webhook 请求 其中写入代码以检查数据库中是否存在帐号 如果是的话 它会获取余额并发回给用户 现在 如果帐号不存在 我必须要求用户再次
  • 使用 json4s 序列化和反序列化 scala 枚举或 case 对象

    假设我有一个枚举或密封的案例对象组 如下所示 sealed abstract class Status case object Complete extends Status case object Failed extends Statu