【问题标题】:Creating a multidimensional array in scala在scala中创建一个多维数组
【发布时间】:2012-06-29 17:07:27
【问题描述】:

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

【问题讨论】:

  • 请更清楚预期的结果是什么。你想要一个多维数组,很好。但是什么存储在哪个维度?例如product_array2(id) 没有意义,因为id 是一个字符串。我的猜测是您想将 id 转换为整数并将其用作外部数组维度。但从你目前的表述中不清楚。
  • PHP 的Array 不是其他任何人都可以识别的数组。也就是通常所说的dictionarymap,在Scala中称为Map

标签: json scala


【解决方案1】:

如果您想访问该结构,@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

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

【讨论】:

    【解决方案2】:

    你可以轻松实现:

    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"))
    

    【讨论】:

      猜你喜欢
      • 2019-10-31
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多