使用Scala.util.parsing.Json在Scala中解析Json

使用Scala.util.parsing.Json在Scala中解析Json,json,scala,Json,Scala,我有一个json对象“{”id“:1,“name:“OZKA”,“birthDate:“1981-02-08T20:00:00.000Z”,“monthRevenue:”1000.75,“developer:”true}”,代码: println(request.getParameter("content"))//{"id":1,"name":"OZKA","birthDate":"1981-02-08T20:00:00.000Z","monthRevenue":1000.75,"develop

我有一个json对象
“{”id“:1,“name:“OZKA”,“birthDate:“1981-02-08T20:00:00.000Z”,“monthRevenue:”1000.75,“developer:”true}”
,代码:

println(request.getParameter("content"))//{"id":1,"name":"OZKA","birthDate":"1981-02-08T20:00:00.000Z","monthRevenue":1000.75,"developer":true}
val result = scala.util.parsing.json.JSON.parseFull(request.getParameter("content"))
result match {
  case Some(e) => { println(e); //output: Map(name -> OZKA, monthRevenue -> 1000.75, developer -> true, birthDate -> 1981-02-08T20:00:00.000Z, id -> 1.0)
    e.foreach((key: Any, value: Any) => {println(key + ":" + value)})
  }
  case None => println("Failed.")
}

,当我尝试调用map或foreach函数时,编译器抛出一个错误“value foreach不是Any的成员”。有人能给我一个方法吗,我如何解析这个json字符串并将其转换为Scala类型

您得到的错误是因为编译器无法知道
Some(e)
模式中
e
的类型,它被推断为
Any
。而
Any
没有
foreach
方法。可以通过将
e
的类型显式指定为
Map
来解决此问题

其次,对于Map
foreach
具有签名
foreach(f:((a,B))⇒ 单位):单位
。匿名函数的参数是一个包含键和值的元组

试着这样做:

println(request.getParameter("content"))//{"id":1,"name":"OZKA","birthDate":"1981-02-08T20:00:00.000Z","monthRevenue":1000.75,"developer":true}
val result = scala.util.parsing.json.JSON.parseFull(request.getParameter("content"))
result match {
  case Some(e:Map[String,String]) => {
    println(e); //output: Map(name -> OZKA, monthRevenue -> 1000.75, developer -> true, birthDate -> 1981-02-08T20:00:00.000Z, id -> 1.0)
    e.foreach { pair =>
        println(pair._1 + ":" + pair._2)        
    }
  }
  case None => println("Failed.")
}

您可以通过以下方式访问任意json中的键和值:

import scala.util.parsing.json.JSON
import scala.collection.immutable.Map

val jsonMap = JSON.parseFull(response).getOrElse(0).asInstanceOf[Map[String,String]]
val innerMap = jsonMap("result").asInstanceOf[Map[String,String]]
innerMap.keys //will give keys
innerMap("anykey") //will give value for any key anykey

谢谢你,它起作用了
e.foreach{pair:Tuple2[String,String]=>println(pair._1+”:“+pair._2)}
I使用了相同的模式来捕捉解析失败,但编译器返回了以下警告:“类型模式映射[String,String]中的非变量类型参数字符串未选中,因为它已被擦除。”