Scala中类似Python的json解析?
来自python背景的我发现在Scala中很难正确解析JSON(特别是当JSON不遵循特定模式时) Python很容易解析JSON,您可以使用Scala中类似Python的json解析?,json,scala,Json,Scala,来自python背景的我发现在Scala中很难正确解析JSON(特别是当JSON不遵循特定模式时) Python很容易解析JSON,您可以使用dict.keys(),dict.values()等迭代元素 Scala中有没有好的JSON库,可以解析JSON而不必定义case类。如果我们有嵌套的JSON,这看起来非常痛苦 我试过Gson和Json4s,它们都需要很多case类来将JSON反映到scala对象中……我们能不做这些就解析和提取值吗 是一个伟大的图书馆。它具有定义编解码器、遍历JSON和解
dict.keys()
,dict.values()
等迭代元素
Scala中有没有好的JSON库,可以解析JSON而不必定义case类
。如果我们有嵌套的JSON,这看起来非常痛苦
我试过Gson和Json4s,它们都需要很多case类来将JSON反映到scala对象中……我们能不做这些就解析和提取值吗 是一个伟大的图书馆。它具有定义编解码器、遍历JSON和解析JSON的优秀功能
此示例(来自文档)显示了无需定义案例类的解析:
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!")
}
这是一个很棒的图书馆。它具有定义编解码器、遍历JSON和解析JSON的优秀功能
此示例(来自文档)显示了无需定义案例类的解析:
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!")
}
使用
lift
json库。将此添加到您的inbuild.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库,这就是上面的示例。要查找更多信息,请查看此文档:这部分文档可能对您有用: 如果JSON具有嵌套对象:
{
"name" : "Bob",
"age": "15",
"address" : {
"street" : "miller avenue",
"city" : "San Francisco"
}
}
那么您的案例类应该如下所示:
case class Address(street: String, city: String)
case class Person(name: String, age: String, address: Address)
通常,您必须使用case类,因为您实在没有其他选择。如果你有别的办法,请告诉我 使用
lift
json库。将此添加到您的inbuild.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库,这就是上面的示例。要查找更多信息,请查看此文档:这部分文档可能对您有用: 如果JSON具有嵌套对象:
{
"name" : "Bob",
"age": "15",
"address" : {
"street" : "miller avenue",
"city" : "San Francisco"
}
}
那么您的案例类应该如下所示:
case class Address(street: String, city: String)
case class Person(name: String, age: String, address: Address)
通常,您必须使用case类,因为您实在没有其他选择。如果你有别的办法,请告诉我