如果我有,我应该使用哪种方法从: 、和JsValue
获取值?JsValue
Json.fromJson
as
asOpt
validate
1 回答
这取决于您想要的错误处理级别。
, as
,asOpt
和validate
所有的共同点是它们将尝试使用任何可以解决的隐式将 a 反序列JsValue
化为您指定的类型。它们的不同之处在于它们的行为方式以及它们返回的类型。T
Reads[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
包含所有错误信息,例如缺少哪些路径以及哪些类型与预期的不匹配。您可以使用fold
on 方法JsResult
安全地处理每种情况。例如:
js.validate[Foo].fold(
errors => /* Do something with the errors */ ,
foo => /* Do something with Foo */
)
Json.fromJson
做与 完全相同的事情JsValue#validate
。他们都调用底层证券Reads
返回 a JsResult
。