我正在解析像这样的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;
答案 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 json,sjson或Jerkson库。
答案 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"))