【问题标题】:Is there a json validation framework in play based on a specified grammar是否有基于指定语法的 json 验证框架
【发布时间】:2013-06-20 23:38:59
【问题描述】:

自动化系统将为应用程序[Play with Scala] 提供 JSON,并且集成的合同是 JSON 不需要验证,因为它总是被认为是正确的。但是出于测试目的,当我们经常播种数据时,我们无法发送正确的 JSON。我们想根据一组语法来验证我们收到的 JSON。有没有一个图书馆已经这样做了。或者有更好的方法吗?

示例:有效 Json 的语法:

"header"->[String, mandatory], 
"footer"->[String], 
"someArray"->Array[String, mandatory], 
"someArrayObject"->Array[
                         {
                          {"key1"->Int, mandatory},
                          {"key2"->String}
                         }, 
                         mandatory
                        ]

和传递,

{  
   "header":"headerContent", 
   "footer":"footerContent", 
   "someArray":["str1", "str2"], 
   "someArrayObject"->[
                       {"key1":4, "key2":"someStringValue"},
                       {"key1":5, "key2":"someOtherStringValue"}
                      ]
} // would pass

{  
   "header":"headerContent", 
   "footer":"footerContent",
   "someArray":["str1", "str2"]
} // would notpass since someArrayObject though declared mandatory is not provided in the sample json

【问题讨论】:

    标签: json scala playframework-2.0


    【解决方案1】:

    我认为 play-json 会满足你play-json

    在 play-json 中,您不会创建一个验证器,而是一个 json 转换器,它本身就是一个验证器。该框架的作者写了一系列博客文章来展示如何使用它:json-transformers

    * 没注意到你使用 play) Play 默认包含 play-json。

    【讨论】:

    • json-transformers 不满足我们的要求。我们正在使用Embedded document pattern,它没有正确的模型,并且 play-json 验证器无法使用它。
    • 如何验证没有定义正确模型的东西?对我来说听起来像一个禅宗公案。如果我正确理解“嵌入式文档模式”,那么实现它的一种方法是将 json 反序列化为 case 类,play-json 擅长于此。无论如何,json-transformers 是一种非常通用的机制,您基本上可以用它对 json 做任何事情,所以如果转换器(或读/写)无法处理您的用例,也许用例是错误的?
    • 好的,我们将进一步探索 json-transformers 并回复您。谢谢!
    【解决方案2】:

    您不必推出自己的 DSL。这就是我们有模式的原因。就像使用 XML 模式来验证您的 XML 文档一样,您可以定义一个 JSON 模式来验证您的 JSON 对象。在使用 Play 构建 RESTful Web 服务时,我也有类似的要求。我通过使用JSON Schema Validator 库解决了这个问题。

    我使用了 JSON Schema 草案 v3。该库支持草稿 v3 和草稿 v4。您可以使用使用相同库的 Web 应用程序针对可能的 JSON 输入验证您的模式。网络应用托管在here

    还有一些很好的例子使用了 v4 草案。您可以通过here查看它们。

    在 Play 2 中,我编写了一个将架构资源文件名作为输入的操作。这避免了控制器操作本身的大量 JSON 验证代码。

    @JsonValidate("user-register.json")
    public static Result create() {
        ...
    }
    

    这样,所有 JSON 验证代码都保留在一个位置。很整洁:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多