在尝试使用lift-json编组到case类之前,我想验证json是否包含键/值的列表。数据可能是嵌套的。
例如:
{
"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
发布于 2012-02-28 09:16:16
在我看来,你有几个选择:
JSON :它只解析一次。这是使用lift-json的最高性能方法。
Con:您已经创建了一个脆弱的手写软件。
parse方法(在this page上搜索"Parsing JSON“)的正常结果,然后是它的类似XPath的表达式(在this page上搜索"XPath + HOFs”),以确定所需的字段是否存在。如果是,则通过将适当的字段传递给构造函数来创建对象。专业版:比#1手写的少。只解析数据一次。
Con:这没有#2快。
Pro:我真的很紧张……如果您预计大部分数据是错误的,那么在进入更为重量级的lift-json反序列化过程之前,就可以确定这一点
Con:在数据有效的情况下,您已经对数据进行了两次解析。
专业版:这是最易维护的解决方案
Con:它比#1和#2慢。
我的建议:除非你绝对需要最好的性能,否则使用#4。如果你真的需要速度,使用#1。使用#1或#2风格的解决方案的另一个好处是,它们允许你对数据进行奇怪的强制,例如将JSON中的两个可选字段名映射到scala对象中的单个字段。
发布于 2012-02-28 15:32:26
这对我来说很有效: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
发布于 2012-08-10 22:41:04
您基本上是在验证模式,所以创建一个与您的对象匹配的描述符,并使用JsonAST遍历对象,以验证每个级别都有正确的元素。如何构造验证器由您决定,但我会镜像类型,这样您就可以同时遍历最后一个验证器和验证器。
https://stackoverflow.com/questions/9474417
复制相似问题