我有一个JSON字符串,它被解析并被一个typecaseted到map
。我正在使用此地图获取List[Map[String, Any]]
。这里为了使我的代码无错,我在类型转换时使用了getOrElse
。
JSON字符串看起来类似于
{
"map-key" : [
{
"list-object-1-key" : "list-object-1-value"
},
{
"list-object-2-key" : "list-object-2-value"
},
]
}
我的代码
val json = JSON.parseFull(string) match {
case Some(e) =>
val list = e.asInstanceOf[Map[String, Any]]
.getOrElse("map-key", List[Map[String,Any]]) // Error here
val info = list.asInstanceOf[List[Map[String, Any]]]
//iterate over each element in the list and perform my operations
case None => string
}
我可以理解,只要list
对象中没有结果,info
对象就会重复代码。
如何通过将默认值赋予list
对象?
答案 0 :(得分:2)
在没有asInstanceOf
的情况下以更实用的方式执行此操作:
val parsed = JSON.parseFull(string)
parsed match {
case Some(e: Map[String, Any]) =>
e.get("map-key") match {
case Some(a: List[Any]) =>
a.foreach {
case inner: Map[String, Any] => println(inner.toList)
}
case _ =>
}
case None => string
}
答案 1 :(得分:0)
不幸的是,我没有这台机器的环境,但尝试类似的东西
首先需要将json转换为map
def jsonStrToMap(jsonStr: String): Map[String, Any] = {
implicit val formats = org.json4s.DefaultFormats
parse(jsonStr).extract[Map[String, Any]]
}
第二件事就是你需要迭代map来获取list的值
val list= jsonStrToMap.map{ case(k,v) => (k.getBytes, v) }. toList
答案 2 :(得分:0)
您的默认值是错误的。您传递了一个类型,而不是一个空列表。
e.asInstanceOf[Map[String, Any]].getOrElse("map-key", List.empty[Map[String,Any]])