如何使用 *non-case* 类通过 Scala 从 JSON 反序列化?

2024-06-03

我正在编写一个 Scala 应用程序,需要序列化和反序列化 JSON。某些 JSON 对象具有超过 22 个字段,因此我无法使用案例类(并且也无法更改格式)。我找到的所有 Scala JSON 库都只能(轻松地)与案例类一起使用,而不是与普通类一起使用。

鉴于此,将大型 JSON 对象(具有超过 22 个字段)反序列化为 Scala 非 case 类的最简单方法是什么?它不一定是完全自动的,但理想情况下,我正在寻找比反序列化到 Map[String, Any] 并手动执行所有操作更轻松的方法。


更新:幸运的是,现在可以使用 Json4s 和 Jackson 使用字段序列化器来完成我想要的操作,如下所示:

implicit val formats = DefaultFormats + FieldSerializer[MyNonCaseClass]()

val myNonCaseClassObject = Serialization.read[MyNonCaseClass](jsonString)

根据下面的要求,这是一个更完整的示例:

import org.json4s.jackson.Serialization
import org.json4s._
import scala.util.Try

object JSONUtil {

implicit val formats = DefaultFormats + FieldSerializer[MyNonCaseClass]() + FieldSerializer[MyOtherNonCaseClass](ignore("someUnwantedFieldName") orElse ignore("anotherFieldToIgnore")) + ...

def toJSON(objectToWrite: AnyRef): String = Serialization.write(objectToWrite)

def fromJSONOption[T](jsonString: String)(implicit mf: Manifest[T]): Option[T] = Try(Serialization.read(jsonString)).toOption

}

那么用法就是:

val jsonString = JSONUtil.toJSON(myObject)
val myNewObject: Option[MyClass] = JSONUtil.fromJSONOption[MyClass](aJsonString)

对于要序列化的每个非案例类,您都需要一个 FieldSerializer。此外,在定义类时,JSON 中可能缺少的所有内容都需要定义为选项。

SBT:

"org.json4s" %% "json4s-jackson" % "3.2.6"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 *non-case* 类通过 Scala 从 JSON 反序列化? 的相关文章

随机推荐

  • Cocoapods 框架不支持配置文件

    我是 iOS 开发领域的新手 我正在从事 iOS 应用程序开发工作 我正在使用 Cocoapods 集成 Alamofire 和 KeychainSwift 等第三方库 当我导出存档以从本地生成 ipa 文件时 它工作正常 但是当我尝试在
  • onClick 事件适用于触摸屏设备上的触摸吗?

    我用过onclick我的网站上的活动 但是 当我在谷歌浏览器的开发人员模式移动视图中打开它时 触摸使用鼠标单击的元素没有任何反应 所以我的问题是 我还必须添加吗ontouch事件连同onclick事件或 onClick 事件适用于所有触摸屏
  • 错误:意外的标记:punc ()

    我正在尝试构建使用 webpack 的项目 我的 UglifyJS 选项如下所示 new UglifyJSPlugin sourceMap false uglifyOptions compress warnings false output
  • 处理不兼容的字符编码:UTF-8 和 ASCII-8BIT

    我在生产中遇到不兼容的字符编码错误 我尝试在本地重现它 但没有成功 这是错误消息 A ActionView Template Error occurred in controller name action name incompatibl
  • 使用 Xcode 为 OS X Lion / Mountain Lion 编译 OpenCV (2.3.1+)

    谁能给我提供一些如何使用 Xcode 在 OS X Lion 上编译 OpenCV 2 3 1 的详细指南 我对此很生气 我得到了源代码 使用 cmake 创建 Xcode 模板并尝试构建它 但它失败并出现大约 200 个错误 提前致谢 多
  • 当 ValidationRules 无法共享时,在 DataTemplates 中重新使用绑定实例

    我正在寻找解决方案和 或为什么在 DataTemplate 中共享 Binding 实例背后的合理性 这最终归结为这样一个事实 在 DataTemplate 中 似乎没有办法为生成的每个控件强制在 DependencyProperty 上绑
  • 有哪些 x86 指令会对 ESP 产生副作用?

    我知道call and ret将修改的值esp然后push and pop有很多变体 但是还有其他指令会影响堆栈指针吗 The following instructions modify the stack pointer as an im
  • 打开下拉菜单时防止 select2 自动聚焦其搜索输入

    我正在寻找一种方法来防止 select2 的搜索输入在打开 select2 下拉菜单时自动聚焦 我知道这是 select2 的预期默认行为 虽然这对于桌面客户端来说很好 但我需要阻止 iPad 上的这种行为 因为它会触发 iPad 软件键盘
  • Xamarin Forms:单击重新启动按钮时网格按钮 UI 中断

    我正在使用一个button在 的里面grid用于显示字母以实施Word search game 最初 用户界面看起来不错 但是当单击play again按钮 UI 中断 截屏 网格内设置按钮的代码 void SetGridLayout ch
  • 选择多个模式的 awk 代码

    这是我的输入文件 比如modified txt r4544 n479826 2012 08 28 07 12 33 0400 Tue 28 Aug 2012 1 line Changed paths M branches 8 6 0 con
  • 如何在R中将plot转换为ggplot?

    我是 R 新手 我正在尝试将绘图转换为 ggplot plot res s type n main title print lines res s res s output 2014 02 14 51 8460 2014 02 14 44
  • 如何在 Spring-Data-JPA Repository 中重用参数?

    在看着查询创建 http docs spring io spring data jpa docs current reference html repositories query methods query creation对于 Spri
  • Firefox 和 Chrome 为 offsetTop 提供了不同的值

    我试图相对于输入字段定位一个跨度元素 让我们称之为 工具提示跨度 为此 我将工具提示跨度和输入字段包装在另一个跨度元素中 我们称之为 包装器跨度 该元素具有position relative 然后我设置position absolute在工
  • sklearn 中组件解释的偏最小二乘方差

    我正在尝试使用 sklearn 中的代码执行 PLSRegression 并且我想保留那些解释一定程度方差的组件 例如 PCA 中的组件 有没有办法知道 PLS 中每个分量解释了多少方差 我也有计算每个组件的解释方差的相同要求 我是 PLS
  • 将 Web API 添加到 asp.net MVC 项目时出现问题(追溯)

    我正在 Visual Studio 2013 中使用 asp net mvc 迈出第一步 但遇到了一个奇怪的问题 我以 MVC 的形式启动了我的项目 并且没有选中 Web API 框来包含核心参考 不过现在我想使用 Web API 功能 我
  • 多线程写入文件

    前几天刚开始使用 python 对多线程的整个概念还很陌生 我在多线程时写入文件时遇到问题 如果我按照常规方式执行此操作 它会不断覆盖正在写入的内容 使用 5 个线程写入文件的正确方法是什么 不降低性能的最佳方法是在所有线程之间使用队列 每
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • bean 中的 Spring JavaConfig 属性未设置?

    我正在考虑将 Spring JavaConfig 与一些属性文件一起使用 但 bean 中的属性未设置 bean 中的属性未设置 这是我的网络配置 Configuration EnableWebMvc PropertySource valu
  • 有没有办法搜索 github wiki 页面?

    我添加了一个维基页面 https github com avidanyum spray tomcat example wiki到 github 存储库 但是当我在 github 中搜索示例文本时 this is a very nice wi
  • 如何使用 *non-case* 类通过 Scala 从 JSON 反序列化?

    我正在编写一个 Scala 应用程序 需要序列化和反序列化 JSON 某些 JSON 对象具有超过 22 个字段 因此我无法使用案例类 并且也无法更改格式 我找到的所有 Scala JSON 库都只能 轻松地 与案例类一起使用 而不是与普通