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 を処理するか、結果を実際に可変の構造に変換する必要があります (配列でやろうとしたこと)。

これは少し厄介になります:

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

つまり、 Lift の jsonsjson、またはJerksonライブラリなど、ノイズのない Scala JSON ソリューションが本当に必要になります。

于 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 に答える