【问题标题】:Python like json parsing in Scala ?Python 像 Scala 中的 json 解析?
【发布时间】:2016-08-12 06:17:03
【问题描述】:

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

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

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

我尝试了 Gson 和 Json4s,它们都需要许多案例类来将 JSON 反映到 scala 对象...我们可以在不执行所有这些操作的情况下解析和提取值吗?

【问题讨论】:

    标签: json scala


    【解决方案1】:

    Argonaut 是很棒的图书馆。它在定义编解码器、遍历 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!")
    
    }
    

    【讨论】:

      【解决方案2】:

      使用lift json 库。将此添加到您的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 class Address(street: String, city: String)
      case class Person(name: String, age: String, address: Address)
      

      通常你必须使用一个你真的没有其他选择的案例类。如果您确实找到了其他方法,请告诉我!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-30
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-24
        相关资源
        最近更新 更多