来自python背景,我发现很难在Scala中正确解析JSON (特别是当JSON不遵循特定的模式时)。
Python轻松地解析JSON,您可以使用dict.keys()、dict.values()等迭代元素。
Scala中是否有好的JSON库,它可以解析JSON而不必定义case class。如果我们嵌套了JSON,这似乎非常痛苦。
我尝试过Gson和Json4s,它们都需要很多案例类来将JSON反射到scala object...Can,我们解析和提取值而不做所有这些?
发布于 2016-08-11 21:59:14
阿戈纳特是一个很好的图书馆。它为定义编解码器、遍历JSON和解析JSON提供了极好的工具。
这个示例(从文档中)显示了不定义case类的解析:
package argonaut.doc
import scalaz._, Scalaz._
import argonaut._, Argonaut._
object ParseExample extends App {
val json = """
{ "name" : "Toddler", "age" : 2, "greeting": "gurgle!" }
"""
// Parse getting either error message or json
val result: String \/ Json =
Parse.parse(json)
// Parse ignoring error messages
val option: Option[Json] =
Parse.parseOption(json)
// Parse handling success and failure with functions
val greeting1: String =
Parse.parseWith(json, _.field("greeting").flatMap(_.string).getOrElse("Hello!"), msg => msg)
// Parse handling success and providing a default for failure
val greeting2: String =
Parse.parseOr(json, _.field("greeting").flatMap(_.string)getOrElse("Hello!"), "Oi!")
}发布于 2016-08-11 22:05:10
使用lift json库。将此添加到您的in build.sbt中
"net.liftweb" %% "lift-json-scalaz" % "3.0-M1"
然后在您的代码中,例如:
import net.liftweb.json._
import net.liftweb.json.DefaultFormats
object test {
def main(args: Array[String]) {
//This is used to map the JSON string to a object in Scala. The constructor parameters have to match the keys in the JSON object.
case class PersonObject (name: String, Age: String)
implicit val formats = DefaultFormats
val jsonString = """ { "name":"Bob", "Age":"14" } """
val parsedJson = parse(jsonString)
val extractedInJsonObject = parsedJson.extract[PersonObject]
val name = extractedInJsonObject.name
}
}如果您想使用lift JSON库,这就是上面的示例。要查找更多信息,请参阅以下文档:
https://github.com/lift/lift/tree/master/framework/lift-base/lift-json
文档的这一部分可能对您有用:https://github.com/lift/lift/tree/master/framework/lift-base/lift-json#extracting-values
如果您的JSON有一个嵌套对象:
{
"name" : "Bob",
"age": "15",
"address" : {
"street" : "miller avenue",
"city" : "San Francisco"
}
}那么您的case类应该如下所示:
case class Address(street: String, city: String)
case class Person(name: String, age: String, address: Address)通常,你必须使用一个案例类,你真的没有别的选择。如果你有别的办法,请告诉我!
https://stackoverflow.com/questions/38905998
复制相似问题