在scala中创建多维数组

时间:2012-06-29 17:07:27

标签: json scala

我正在解析像这样的json对象:

val product_array:Option[Any] = scala.util.parsing.json.JSON.parseFull(products_json)

var product_array2 = Array()

product_array match {
case Some(p) => {
for {
  (id, desc) <- p.asInstanceOf[Map[String,Map[String,Any]]]
  (propName, propValue) <- desc
}  product_array2(id) ++ Array(propName->propValue.toString)
}
case None => test = "No products in shopping cart"
}

问题是我正在尝试用这一行创建一个多维数组:

product_array2(id) ++ Array(propName->propValue.toString)

但它不起作用。如何在for循环中创建多维数组?

希望我能澄清一下:

在PHP中就是这样:

product_array2[id][propName]=propValue;

2 个答案:

答案 0 :(得分:2)

如果你想访问这个结构,@ lpaul7的答案会告诉你如何。如果要更新结构,您需要处理嵌套的不可变Map,或者将结果确实转换为可变结构(您尝试对数组执行的操作)。

这有点令人讨厌:

import scala.util.parsing.json.JSON._

val json = """{"id": {"age": 33}}"""

val im = parseFull(json) match {
  case Some(m: Map[_, _]) => 
    m.asInstanceOf[Map[String, Any]].collect {
      case (key, value: Map[_, _]) => (key, value.asInstanceOf[Map[String, Any]])
    }
  case _ => Map.empty[String, Map[String, Any]]
}

查询:

im("id")("age")

不可变更新:

val updated = im + ("id" -> (im.getOrElse("id", Map.empty) + ("age" -> 44)))

可变结构(使用外部和内部结构的可变映射):

import collection.{breakOut, mutable}

val mut: mutable.Map[String, mutable.Map[String, Any]] = 
   im.map { case (key, inner) => key -> mutable.Map(inner.toSeq: _*)} (breakOut)

可变更新:

mut("id")("age") = 55

换句话说,您确实需要noise-free Scala JSON solution,例如Lift's jsonsjsonJerkson库。

答案 1 :(得分:1)

您可以轻松实现:

import scala.util.parsing.json.JSON._

val products_json = """{"p...67890"}}"""

val product_array = 
  parseFull(products_json).get.asInstanceOf[Map[String,Map[String,Any]]]

println(product_array("product1Id")("product_name"))