使用lift-json在scala中验证json



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

例如:

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

我有什么方法可以验证这个JSON包含"name"、"age"one_answers"address\street"的值?假设所有其他字段都是可选的。

如果我遗漏了一些明显的东西,很抱歉,但我怀疑类似的事情以前已经解决了。

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

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

  1. 您可以使用lift-json的"低级pull解析器API"(在这个页面上搜索这个短语)来获取您关心的每个字段。如果在遇到End令牌时,您还没有得到所需的所有字段,则抛出一个异常。如果您有所需的字段,则创建您的对象。

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

    Con:您已经创建了脆弱的手动软件。

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

    Pro:比#1少手动滚动。只解析一次数据。

    Con:这没有#2那么快。

  3. 使用#1或#2中的方法来确定是否存在所需字段。如果是,那么使用lift-json的反序列化(在该页面上查找"Serialization"标题)来创建和对象。

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

    Con:在数据有效的情况下,您已经对数据进行了两次解析。

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

    Pro:这是最易维护的解决方案

    Con:它比#1和#2慢。

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

这对我很有效:Scala中JSON到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

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

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

我们的团队已经开始研究Orderly。对于我们正在使用的JSON对象,OrderLy可以充分地描述它们。我认为我们将使用它们。

你提到的Orderly图书馆:https://github.com/nparry/orderly4jvm看起来很不错。当验证失败时,它会给出不错的错误消息。

我们研究了使用Json Schema,特别是Java库Json模式验证器:https://github.com/fge/json-schema-validator

错误消息没有那么描述性。

相关内容

  • 没有找到相关文章

最新更新