【问题标题】:validating json in scala with lift-json使用 lift-json 在 scala 中验证 json
【发布时间】:2012-02-28 00:08:31
【问题描述】:

我想在尝试使用 lift-json 编组到案例类之前验证 json 是否包含键/值列表。数据可能是嵌套的。

例如:

{ 
 "name": "stack",
 "desc": "desc",
 "age": 29,
 "address": {
  "street": "123 elm", 
  "postal_code": 22222,
  "city": "slc",
 }
}

我可以通过哪些方式验证此 JSON 是否包含“姓名”、“年龄”和“地址\街道”的值?假设所有其他字段都是可选的。

对不起,如果我遗漏了一些明显的东西,但我怀疑以前已经解决过类似的问题。

顺便问一下,有人尝试过 Orderly 吗? https://github.com/nparry/orderly4jvm

【问题讨论】:

    标签: scala lift-json


    【解决方案1】:

    在我看来,您有几个选择:

    1. 您可以使用 lift-json 的“Low level pull parser API”(在 this page 上搜索该短语)来获取您关心的每个字段。如果在遇到 End 标记时还没有获得所有想要的字段,则抛出异常。如果您有必填字段,请创建您的对象。

      Pro:这只解析 JSON 一次。这是使用 lift-json 性能最高的方式。

      骗局:您创建了脆弱的手卷软件。

    2. 您可以使用 lift-json 的 JsonAST,这是调用其 parse 方法的正常结果(在 this page 上搜索“Parsing JSON”),然后使用其类似 XPath 的表达式(搜索“XPath + HOFs " on this page) 以确定是否存在必填字段。如果是,则通过将适当的字段传递给构造函数来创建您的对象。

      专业版:比#1 更少的手卷。只解析一次数据。

      骗局:这没有#2那么快。

    3. 使用#1 或#2 中的方法来确定是否存在必填字段。如果是,则使用 lift-json 的反序列化(在 this page 上查找“序列化”标题)来创建和对象。

      专业人士我真的在这里伸展...如果您预计大部分数据是坏的,您可以在输入之前确定Lift-json 反序列化的重量级过程

      缺点:在数据有效的情况下,你已经解析了两次数据。

    4. 只需使用 lift-json 的反序列化(在 this page 上查找“序列化”标题)。它或多或少做了 #2 中描述的事情,只是它使用反射来确定需要哪些字段。

      专业版:这是最易维护的解决方案

      缺点:比 #1 和 #2 慢。

    我的建议:除非您绝对需要最佳性能,否则请使用 #4。如果您真的需要速度,请使用#1。使用 #1 或 #2 样式解决方案的另一个好处是它们允许您对数据进行奇怪的强制转换,例如将 JSON 中的两个替代字段名称映射到 scala 对象中的单个字段。

    【讨论】:

      【解决方案2】:

      这对我有用: JSON to XML in Scala and dealing with Option() result

      这是我上一个问题的一个非常简单的剪切和粘贴。它并不完全符合您的要求,但可能会给您一些想法:

      import util.parsing.json.JSON._
      
      object JsonSoap {
        def main(args: Array[String]) {
          val x = parseFull("""{"name":"Joe","surname":"SOAP"}""")
      
          val y = x collect {
            case m: Map[_, _] => m collect {
              case (key: String, value: String) => key -> value
            }
          }
      
          val z = for (m <- y; name <- m.get("name"); surname <- m.get("surname"))
          yield {
            <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
              <soap:Body>
                <Person>
                  <Name>{name}</Name>
                  <Surname>{surname}</Surname>
                </Person>
              </soap:Body>
            </soap:Envelope>
          }
      
          println(z)
        }
      }
      

      你看过这些吗:

      Parse JSON in Scala using standard Scala

      Parsing JSON and iterating though the object

      Simple JSON to XML

      【讨论】:

        【解决方案3】:

        您基本上是在验证模式,因此创建一个与您的对象匹配的描述符并使用 JsonAST 验证每个级别是否具有正确的元素来遍历对象。如何构建验证器取决于您,但我会镜像类型,以便您可以同时使用 ast 和验证器。

        【讨论】:

          【解决方案4】:

          我开发了这个 json 解析器/验证器 https://github.com/HigherState/jameson

          【讨论】:

            【解决方案5】:

            我们的团队已经开始关注 Orderly。对于我们使用的 JSON 对象,OrderLy 可以充分描述它们。我想我们会使用它们。

            您提到的有序库: https://github.com/nparry/orderly4jvm 似乎非常好。当验证失败时,它会给出正确的错误消息。

            我们研究了使用 Json Schema,尤其是 Java 库 json-schema-validator: https://github.com/fge/json-schema-validator

            错误消息没有描述性。

            【讨论】:

              猜你喜欢
              • 2016-04-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-30
              • 2011-01-14
              • 1970-01-01
              • 2015-07-06
              相关资源
              最近更新 更多