Json.fromJson,as,asOpt和validate之间有什么区别?

时间:2017-03-10 21:24:32

标签: scala playframework play-json

如果我有JsValue,我应使用哪种方法从JsValue获取值:Json.fromJsonasasOpt和{{1 }}?

1 个答案:

答案 0 :(得分:3)

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

asasOptvalidate的共同点是,他们会尝试将JsValue反序列化为T类型指定,使用隐式Reads[T]可以解决的任何问题。它们的不同之处在于它们的行为方式以及它们返回的类型。

假设我们正在使用已定义隐式Foo的班级Reads[Foo]

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

asOpt[Foo]会尝试将JsValue转换为Foo,如果失败,则会返回None。如果成功,它将返回Some中包含的反序列化值。这比as要好得多,因为你被迫面对失败的情况(除非你做一些愚蠢的事情,比如叫.get)。缺点是,在将失败转换为None时会吞下所有错误,因此您不知道失败的原因。如果你不在乎,使用asOpt完全没问题。

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

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

Json.fromJsonJsValue#validate完全相同。他们都会调用基础Reads来返回JsResult