Scala 什么';Json.fromJson、as、asOpt和validate之间的区别是什么?
如果我有一个Scala 什么';Json.fromJson、as、asOpt和validate之间的区别是什么?,scala,playframework,play-json,Scala,Playframework,Play Json,如果我有一个JsValue,我应该使用哪种方法从JsValue获取值:Json.fromJson,as,asOpt和validate 这取决于所需的错误处理级别 as、asOpt和validate的共同点是,它们将尝试将JsValue反序列化到您指定的类型T,使用可以解析的隐式读取[T]。它们的不同之处在于它们的行为方式以及返回的类型 假设我们正在使用一个类Foo,其中我们已经定义了一个隐式读取[Foo] as[Foo]将尝试将JsValue转换为Foo,如果失败,将抛出异常。这不是一件安全的事
JsValue
,我应该使用哪种方法从JsValue
获取值:Json.fromJson
,as
,asOpt
和validate
这取决于所需的错误处理级别
as
、asOpt
和validate
的共同点是,它们将尝试将JsValue
反序列化到您指定的类型T
,使用可以解析的隐式读取[T]
。它们的不同之处在于它们的行为方式以及返回的类型
假设我们正在使用一个类Foo
,其中我们已经定义了一个隐式读取[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
,其中包含所有错误信息,例如缺少哪些路径以及哪些类型与预期的不匹配。您可以使用JsResult
上的fold
方法安全处理每个案例。例如:
js.validate[Foo].fold(
errors => /* Do something with the errors */ ,
foo => /* Do something with Foo */
)
Json.fromJson
的作用与JsValue\validate
完全相同。它们都调用底层的Reads
来返回JsResult
它取决于所需的错误处理级别
as
、asOpt
和validate
的共同点是,它们将尝试将JsValue
反序列化到您指定的类型T
,使用可以解析的隐式读取[T]
。它们的不同之处在于它们的行为方式以及返回的类型
假设我们正在使用一个类Foo
,其中我们已经定义了一个隐式读取[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
,其中包含所有错误信息,例如缺少哪些路径以及哪些类型与预期的不匹配。您可以使用JsResult
上的fold
方法安全处理每个案例。例如:
js.validate[Foo].fold(
errors => /* Do something with the errors */ ,
foo => /* Do something with Foo */
)
Json.fromJson
的作用与JsValue\validate
完全相同。它们都调用底层的Reads
来返回JsResult
是否要将对象解析为模型?你有一个原始物体吗?你的问题太广泛了你想把对象解析成模型吗?你有一个原始物体吗?你的问题太广泛了,重要的是,asOpt
可以抛出JsResultException
s。重要的是,asOpt
可以抛出JsResultException
s。