scala - Scala 案例类,其字段在不同实例中可以是强制的和可选的
问题描述
我在 akka http 中创建了两个休息端点,它们将字符串作为输入,使用 Json4s 对其进行解析,然后对其进行处理。我的案例课就像 -
final case class A(id: String, name: String, address: String)
第一个端点仅接收 id 而另一个接收所有三个字段,我想对两者使用相同的案例类 A。所以我使用了名称和地址字段的默认值,例如 -
final case class A(id: Stirng, name: String = "", address: String = "")
这对我很有用。但是现在,如果我不在第二个端点发送地址或名称(或两者)字段,它不会引发异常,说明未找到名称(或地址)。
所以,我的问题是我是否可以创建一个端点,其中 id 是强制性的,而其他字段无关紧要,另一个端点是每个字段都是强制性的,使用相同的案例类?将字符串解析为案例类的代码是 -
parse(jsonStr).extract[A]
我希望你明白我的意思。
有什么建议么 ?
解决方案
有两种方法可以实现你想做的事情。
选项 + 验证
名称和地址是可选的,因此您需要处理它们。
case class A(id: String, name: Option[String], address: Option[String])
val json = """{ "id":"1" }"""
// 1st endpoint
val r = parse(json).extract[A]
r.name.getOrElse("foo")
r.address.getOrElse("bar")
// 2nd endpoint
val r2 = parse(json).extract[A]
r2.name.getOrElse(/* boom! */)
默认 JObject + 合并
或者您可以使用替代 JObject 为您的输入提供默认值。
case class A(id: String, name: String, address: String)
val json = """{ "id":"1" }"""
val defaultValues = JObject(("name", JString("foo")), ("address", JString("bar")))
// 1st endpoint
val r = defaultValues.merge(parse(json)).extract[A]
// 2nd endpoint
val r2 = parse(json).extract[A] // boom! again
推荐阅读
- python - 为什么每当我尝试使用时都会出错,例如:Jupyter Notebook Python 上的“with open('file.txt') as my_new_file.txt:”?
- c++ - VSCode:警告;未检测到被调试者目标架构,假设为 x86_64
- c++ - 如何为单列和双列节点c ++构造模板层次结构
- python - 即使我认为我满足要求,也找不到满足要求 tensorflow==1.15 的版本?
- python - 当其他人工作正常时,为什么我不能 pip 安装这个特定的 github 项目?
- android-studio - 如何将活动的变量传递给 BottomNavigationView 的片段?
- xml - 自定义用户创建模板 onchange 不起作用
- ios - 以 Debug 与 Release 运行时 CPU 使用率较高(仪器以 Release 运行)。如何调试?
- html - 得到
- javascript - Window.onUnload 不一致地向服务器发送结果