首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scala中使用lift-json验证json

在scala中使用lift-json验证json
EN

Stack Overflow用户
提问于 2012-02-28 08:08:31
回答 5查看 2.4K关注 0票数 4

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

例如:

代码语言:javascript
复制
{ 
 "name": "stack",
 "desc": "desc",
 "age": 29,
 "address": {
  "street": "123 elm", 
  "postal_code": 22222,
  "city": "slc",
 }
}

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

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

顺便说一句,有没有人试过有序的?https://github.com/nparry/orderly4jvm

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-28 09:16:16

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

  1. 你可以使用lift-json的“低级拉取解析器API”(在this page上搜索该短语)来抓取你关心的每个字段。如果在遇到结束令牌时还没有得到所需的所有字段,就会抛出一个异常。如果您有必填字段,则创建您的对象。

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

Con:您已经创建了一个脆弱的手写软件。

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

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

Con:这没有#2快。

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

Pro:我真的很紧张……如果您预计大部分数据是错误的,那么在进入更为重量级的lift-json反序列化过程之前,就可以确定这一点

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

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

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

Con:它比#1和#2慢。

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

票数 4
EN

Stack Overflow用户

发布于 2012-02-28 15:32:26

这对我来说很有效:JSON to XML in Scala and dealing with Option() result

这是我上一个问题的一个非常简单的剪切和粘贴。它不是你的需求的完美匹配,但可能会给你一些想法:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2012-08-10 22:41:04

您基本上是在验证模式,所以创建一个与您的对象匹配的描述符,并使用JsonAST遍历对象,以验证每个级别都有正确的元素。如何构造验证器由您决定,但我会镜像类型,这样您就可以同时遍历最后一个验证器和验证器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9474417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档