4

在尝试使用 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

4

5 回答 5

4

正如我所看到的,您有几个选择:

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

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

    缺点:您创建了脆弱的手卷软件。

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

    优点:手卷比#1少。只解析一次数据。

    缺点:这不如#2 快。

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

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

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

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

    优点:这是最可维护的解决方案

    缺点:它比#1 和#2 慢。

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

于 2012-02-28T01:16:15.907 回答
0

这对我有用: JSON 到 Scala 中的 XML 和处理 Option() 结果

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

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)
  }
}

你有没有看过这些:

使用标准 Scala 在 Scala 中解析 JSON

解析 JSON 并迭代对象

简单的 JSON 到 XML

于 2012-02-28T07:32:26.190 回答
0

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

于 2012-08-10T14:41:04.400 回答
0

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

于 2013-05-18T10:33:52.090 回答
0

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

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

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

错误消息没有描述性。

于 2014-12-12T20:10:47.340 回答