如果我有,我应该使用哪种方法从: 、和JsValue获取值?JsValueJson.fromJsonasasOptvalidate
1 回答
这取决于您想要的错误处理级别。
, as,asOpt和validate所有的共同点是它们将尝试使用任何可以解决的隐式将 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。