json - 如何使用标准 Scala 类在 Scala 中解析 JSON?

标签 json scala

我正在使用 Scala 2.8 中的内置 JSON 类来解析 JSON 代码。由于最小化依赖关系,我不想使用 Liftweb 之一或任何其他。

我这样做的方式似乎太迫切了,有没有更好的方法?

import scala.util.parsing.json._
...
val json:Option[Any] = JSON.parseFull(jsonString)
val map:Map[String,Any] = json.get.asInstanceOf[Map[String, Any]]
val languages:List[Any] = map.get("languages").get.asInstanceOf[List[Any]]
languages.foreach( langMap => {
val language:Map[String,Any] = langMap.asInstanceOf[Map[String,Any]]
val name:String = language.get("name").get.asInstanceOf[String]
val isActive:Boolean = language.get("is_active").get.asInstanceOf[Boolean]
val completeness:Double = language.get("completeness").get.asInstanceOf[Double]
}

最佳答案

这是一个基于提取器的解决方案,它将进行类转换:

class CC[T] { def unapply(a:Any):Option[T] = Some(a.asInstanceOf[T]) }

object M extends CC[Map[String, Any]]
object L extends CC[List[Any]]
object S extends CC[String]
object D extends CC[Double]
object B extends CC[Boolean]

val jsonString =
    """
      {
        "languages": [{
            "name": "English",
            "is_active": true,
            "completeness": 2.5
        }, {
            "name": "Latin",
            "is_active": false,
            "completeness": 0.9
        }]
      }
    """.stripMargin

val result = for {
    Some(M(map)) <- List(JSON.parseFull(jsonString))
    L(languages) = map("languages")
    M(language) <- languages
    S(name) = language("name")
    B(active) = language("is_active")
    D(completeness) = language("completeness")
} yield {
    (name, active, completeness)
}

assert( result == List(("English",true,2.5), ("Latin",false,0.9)))

在 for 循环的开始,我人为地将结果包装在一个列表中,以便它在最后产生一个列表。然后在 for 循环的其余部分中,我使用生成器(使用 <- )和值定义(使用 = )将使用 unapply 方法。

(旧答案已被删除 - 如果您好奇,请查看编辑历史记录)

关于json - 如何使用标准 Scala 类在 Scala 中解析 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4170949/

相关文章:

scala - 这可以做成尾递归吗?

scala - Spark 2.3.0 找不到数据源 : kafka

php - 从 JavaScript 数组对象中的值中删除引号

java - 以 google.gson.JsonArray 格式从 MongoDB 返回大型数据集的有效方法

scala - SBT 预计什么时候移植到 Scala 2.8?

scala - Play Framework Scala 在后台运行作业

Scala:如何在编译时不知道类型的情况下调用具有类型参数和 list 的方法?

c# - HttpClient PostAsJsonAsync 与 Newtonsoft.Json 不兼容

json - 如何同时使用 xml/json 和 form-urlencoded?

json - 在Groovy中从JSONArray删除特定的JSONObject