创建一个包含空地图的列表

时间:2018-03-15 08:42:20

标签: scala

我有一个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对象?

来改进此程序

3 个答案:

答案 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]])