如果我有JsValue
,我应使用哪种方法从JsValue
获取值:Json.fromJson
,as
,asOpt
和{{1 }}?
答案 0 :(得分:3)
这取决于您想要的错误处理级别。
as
,asOpt
和validate
的共同点是,他们会尝试将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.fromJson
与JsValue#validate
完全相同。他们都会调用基础Reads
来返回JsResult
。