1

我正在解析这样的 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;
4

2 回答 2

2

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

这有点令人讨厌:

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

换句话说,您真的需要一个无噪音的 Scala JSON 解决方案,例如Lift 的 jsonsjsonJerkson库。

于 2012-06-29T18:39:02.110 回答
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"))
于 2012-06-29T17:53:49.957 回答