1

如果我有,我应该使用哪种方法从: 、和JsValue获取值?JsValueJson.fromJsonasasOptvalidate

4

1 回答 1

4

这取决于您想要的错误处理级别。

, as,asOptvalidate所有的共同点是它们将尝试使用任何可以解决的隐式将 a 反序列JsValue化为您指定的类型。它们的不同之处在于它们的行为方式以及它们返回的类型。TReads[T]

假设我们正在使用一个已经定义Foo了隐式的类。Reads[Foo]

as[Foo]只会尝试将 a 转换JsValue为 a Foo,如果失败,它将抛出异常。这不是一件安全的事情,因为处理错误的唯一方法是捕获异常并处理它,您可能不记得这样做。JSON 无法映射到某种类型也很少是例外情况——这种情况一直都在发生。as应该很少使用,最多。

asOpt[Foo]将尝试将 a 转换JsValue为 a Foo,如果失败,它将简单地返回None。如果成功,它将返回包装在Some. 这比 好得多as,因为您被迫面对失败案例(除非您做一些愚蠢的事情,例如 call .get)。缺点是,在将 failure 转换为 时,所有错误都被吞没了None,所以你不知道它失败的原因。如果您不在乎,使用asOpt完全没问题。

validate[Foo]将尝试将 a 转换JsValue为 a Foo,并且始终返回 a JsResult[Foo]。如果转换成功,它将是一个JsSuccess[Foo]包含反序列化值的。如果失败,它将JsError包含所有错误信息,例如缺少哪些路径以及哪些类型与预期的不匹配。您可以使用foldon 方法JsResult安全地处理每种情况。例如:

js.validate[Foo].fold(
  errors => /* Do something with the errors */ ,
  foo => /* Do something with Foo */
)

Json.fromJson做与 完全相同的事情JsValue#validate。他们都调用底层证券Reads返回 a JsResult

于 2017-03-10T22:15:57.507 回答