首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python喜欢Scala中的json解析吗?

Python喜欢Scala中的json解析吗?
EN

Stack Overflow用户
提问于 2016-08-11 20:56:06
回答 2查看 1.3K关注 0票数 1

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

Python轻松地解析JSON,您可以使用dict.keys()dict.values()等迭代元素。

Scala中是否有好的JSON库,它可以解析JSON而不必定义case class。如果我们嵌套了JSON,这似乎非常痛苦。

我尝试过Gson和Json4s,它们都需要很多案例类来将JSON反射到scala object...Can,我们解析和提取值而不做所有这些?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-11 21:59:14

阿戈纳特是一个很好的图书馆。它为定义编解码器、遍历JSON和解析JSON提供了极好的工具。

这个示例(从文档中)显示了不定义case类的解析:

代码语言:javascript
复制
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!")

}
票数 0
EN

Stack Overflow用户

发布于 2016-08-11 22:05:10

使用lift json库。将此添加到您的in build.sbt

"net.liftweb" %% "lift-json-scalaz" % "3.0-M1"

然后在您的代码中,例如:

代码语言:javascript
复制
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有一个嵌套对象:

代码语言:javascript
复制
{
  "name" : "Bob",
  "age": "15",
  "address" : {
     "street" : "miller avenue",
     "city" : "San Francisco"
  }
}

那么您的case类应该如下所示:

代码语言:javascript
复制
case class Address(street: String, city: String)
case class Person(name: String, age: String, address: Address)

通常,你必须使用一个案例类,你真的没有别的选择。如果你有别的办法,请告诉我!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38905998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档