我使用Scala 2.8中的内置JSON类来解析JSON代码.由于最小化依赖性,我不想使用Liftweb.

The way I am doing it seems too imperative, is there a better way to do it?

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相关问答推荐

将数据从嵌套的SON数组提取到更简单的数组中

替换字符串中特殊字符的Jolt变换

通过在织女星简化图上裁剪来显示文本

VBA json按特定属性名称提取所有数据

jq 对特定键进行过滤并将值整理到单个 csv 单元格中

PostgreSQL:删除 JSONB 数组中每个元素的特定键

如何使用Powershell查找所有包含特定键值对的JSON对象并迭代所有对象?

JOLT转换并向输出添加新数组

try 使用 JQ 转换 JSON 中过于复杂的对象数组

从字节解码 JSON 数据,将 float 值更改为 int

Vue 3如何将参数作为json发送到axios get

使用 JQ 从文件中删除重复的 JSON 块

字典和对象的模型创建问题

如何获取json格式的KendoGrid显示数据?

将 PHP 结果数组转换为 JSON

如何将 Swift 对象转换为字典

如何创建 JSON 对象 Node.js

将 javascript 对象或数组转换为 json 以获取 ajax 数据

NSManagedObject 属性值的 NSNull 处理

有没有办法折叠 Postman 中的所有 json 字段