【问题标题】:Deserializing Option returns None instead of an exception in json4s反序列化选项返回 None 而不是 json4s 中的异常
【发布时间】:2020-06-09 14:00:47
【问题描述】:

运行以下代码时,我预计会出现异常,但我得到的是None。这是预期的吗?

import org.json4s.jackson.JsonMethods
import org.json4s.{DefaultFormats, Formats}
implicit val f: Formats = DefaultFormats
val json ="{ \"a\" : { \"c\": 1 }}"

case class Foo(a: Option[String])
val foo = JsonMethods.parse(json).extract[Foo]

println(foo)

>  Foo(None)

还有那个代码:

import org.json4s.jackson.JsonMethods
import org.json4s.{DefaultFormats, Formats}
implicit val f: Formats = DefaultFormats
val json ="{ \"a\" : { \"c\": 1 }}"

case class Foo(a: String = "")
val foo = JsonMethods.parse(json).extract[Foo]

println(foo)

>  Foo()

【问题讨论】:

  • 好吧,我认为 Option 的想法是它不应该失败。如果它无法将a 读取为String,那么它将返回None
  • Option 表示它是可选的,不是错误的类型。
  • 嗯,你说得对。这取决于您希望它有多严格。大概有办法配置吧。
  • 注意:Json4s 是 vulnerable under DoS/DoW attacks!

标签: scala json4s


【解决方案1】:

您可以通过更改默认格式来强制执行严格的选项解析

implicit val f: Formats = DefaultFormats.withStrictOptionParsing

潜在的异常:

[error] (run-main-2) org.json4s.package$MappingException: No usable value for a
[error] Do not know how to convert JObject(List((c,JInt(1)))) into class java.lang.String

【讨论】:

    最近更新 更多