为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

我正在使用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]}
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

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


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方法的事实。


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


查看完整回答
反对 回复 2019-10-05
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

这是我进行模式匹配的方式:


val result = JSON.parseFull(jsonStr)

result match {

  // Matches if jsonStr is valid JSON and represents a Map of Strings to Any

  case Some(map: Map[String, Any]) => println(map)

  case None => println("Parsing failed")

  case other => println("Unknown data structure: " + other)

}


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 1139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信