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。