gpt4 book ai didi

json - 如何在 Play 2.x 中强制执行 JSON 的严格序列化

转载 作者:行者123 更新时间:2023-12-02 04:48:53 24 4
gpt4 key购买 nike

当从 JSON 序列化到案例类时,Play 的 JSON 序列化默认是允许的。例如。

case class Stuff(name: String, value: Option[Boolean])

implicit val stuffReads: Reads[Stuff] = (
( __ \ 'name).read[String] and
( __ \ 'value).readNullable[Boolean]
)(Stuff.apply _)

如果收到以下 JSON:

{name: "My Stuff", value: true, extraField: "this shouldn't be here"}

它将成功并返回“JsSuccess”并丢弃“extraField”。

有没有一种方法可以构造 Json Reads 函数,使其在存在“未处理”字段时返回 JsError?

最佳答案

您可以在执行自己的解码之前验证该对象不包含额外的 key :

import play.api.data.validation.ValidationError

def onlyFields(allowed: String*): Reads[JsObject] = Reads.filter(
ValidationError("One or more extra fields!")
)(_.keys.forall(allowed.contains))

或者,如果您不关心错误消息(无论如何,错误消息不是很有用):

def onlyFields(allowed: String*): Reads[JsObject] =
Reads.verifying(_.keys.forall(allowed.contains))

然后:

implicit val stuffReads: Reads[Stuff] = onlyFields("name", "value") andThen (
(__ \ 'name).read[String] and
(__ \ 'value).readNullable[Boolean]
)(Stuff)

重复不是很好,但它有效。

关于json - 如何在 Play 2.x 中强制执行 JSON 的严格序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com