在尝试使用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
在我看来,您有几个选项:
-
您可以使用lift-json的"低级pull解析器API"(在这个页面上搜索这个短语)来获取您关心的每个字段。如果在遇到End令牌时,您还没有得到所需的所有字段,则抛出一个异常。如果您有所需的字段,则创建您的对象。
Pro:这只解析JSON一次。这是使用lift-json的最高性能方式。
Con:您已经创建了脆弱的手动软件。
-
您可以使用lift-json的JsonAST,这是调用其
parse
方法(在此页面上搜索"解析json")的正常结果,然后使用其类似XPath的表达式(在此页面中搜索"XPath+HOF")来确定是否存在所需字段。如果是,则通过将适当的字段传递给构造函数来创建对象。Pro:比#1少手动滚动。只解析一次数据。
Con:这没有#2那么快。
-
使用#1或#2中的方法来确定是否存在所需字段。如果是,那么使用lift-json的反序列化(在该页面上查找"Serialization"标题)来创建和对象。
专业:我真的在这里伸展如果您预计大部分数据都是坏的,那么在进入更重量级的lift-json反序列化过程之前,您就可以确定这一点
Con:在数据有效的情况下,您已经对数据进行了两次解析。
-
只需使用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
错误消息没有那么描述性。