Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中类似Python的json解析?_Json_Scala - Fatal编程技术网

Scala中类似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和解

来自python背景的我发现在Scala中很难正确解析JSON(特别是当JSON不遵循特定模式时)

Python很容易解析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库。将此添加到您的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库,这就是上面的示例。要查找更多信息,请查看此文档:

这部分文档可能对您有用:

如果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库。将此添加到您的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库,这就是上面的示例。要查找更多信息,请查看此文档:

这部分文档可能对您有用:

如果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类,因为您实在没有其他选择。如果你有别的办法,请告诉我