当前位置: 首页 > 面试题库 >

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

曹钊
2023-03-14
问题内容

从JSON序列化为case类时,默认情况下允许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?


问题答案:

您可以在执行自己的解码之前验证对象是否不包含其他键:

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的程序中使用某些MongoDB命令的原始输出。当我在蒙戈shell中运行命令,他们代表扩展JSON,在“shell模式”领域,具有特殊的领域,如,和。我看到的文档,以“严格模式”中引用,但我看不出有什么办法把它的壳,或像运行命令的方式在事情 做 输出严格JSON一样。如何强制Mongo输出符合标准的JSON? 问题答案: MongoDB shell讲Java语言,

  • 问题内容: 我想在Play2中将Scala对象列表反序列化为JSON映射-我说这是JSON的一个非常简单的用例。我的JSON输出如下所示: 为此,我正在看Play2的JSON文档 “ The Play JSON library” 。对我来说,他们的例子非常琐碎,我已经证实它们对我有用。因此,我能够正确地反序列化单个对象。 但是,当我阅读文档时,在Play2中制作包含JSON列表的映射似乎有些冗长。

  • 我正在尝试使用Laravel框架构建REST api,我想要一种强制api始终使用JSON响应的方法,而不是手动执行以下操作: 换句话说,我希望每个响应都是JSON。有什么好办法吗? 更新:响应必须是JSON,即使在异常(如not found exception)上也是如此。

  • 问题内容: 我们的REST API接收一些JSON对象输入,其中某些字段必须不为null。这些可以是String / Integer,甚至可以是其他一些类实例作为参考。 我们正在尝试寻找一种方法来强制这些字段不为null,而不是在API中进行null检查的正确方法。当前: 我们想要的是这样的: 我们尝试了3件事: 1)升级到杰克逊2.0.6并使用注释com.fasterxml.jackson.an

  • 问题内容: 我定义了一个MySQL表: 我在这里阅读到MySQL不支持带条件的。对于每个 customerId, 我们只有一个 primaryImage = 1 。 那么我还能采取什么措施来强制执行此约束? 问题答案: 完美支持独特的约束。 但是,它不支持部分约束/索引,因此您需要使用而不是标记非主图像。 您可以将任意数量的值插入到每个客户中,但只能插入一个非空值。

  • 问题内容: 我正在通过BEA Weblogic Server v9.2运行时环境在Eclipse中启动Weblogic应用程序。如果这是直接从命令行运行的,我将执行ctrl- BREAK强制执行线程转储。在Eclipse中有办法吗? 问题答案: 确实(感谢VonC指向SO线程),Dustin在对其消息的评论中指向jstack。 我已经在Eclipse中运行了一个小的Java应用程序(带有GUI),