2

この行からオブジェクトを取得しています:

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

印刷時のオブジェクトは次のようになります。

(product1Id,Map(product_picture -> https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/IPhone_3G.png/250px-IPhone_3G.png, product_price -> 299.99, recipient_picture -> https://www.allianz.com/static-resources/de/presse/mediendatenbank/people/v_1338807733000/zimerer_portrait_small_326x217.jpg, product_amount_gifted -> 100.00, recipient_username -> jDoe, product_name -> iPhone 3G, recipient_id -> 12345))(product2Id,Map(product_picture -> https://upload.wikimedia.org/wikipedia/en/thumb/7/7c/1stGen-iPad-HomeScreen.jpg/220px-1stGen-iPad-HomeScreen.jpg, product_price -> 399.99, recipient_picture -> https://image1.masterfile.com/em_w/05/11/94/400-05119409w.jpg, product_amount_gifted -> 200.00, recipient_username -> MJohnson, product_name -> iPad, recipient_id -> 67890)) 

配列/オブジェクトをループしてキーと値を抽出するにはどうすればよいですか?

アップデート:

オブジェクトをループしようとすると、以下のキーと値に空白の値が送信されます。

for((key, value) <- product_array)     {       

}

元のjsonは次のとおりです。

{
   "product1Id":{
      "product_name":"iPhone 3G",
      "product_price":"299.99",
      "product_amount_gifted":"100.00",
      "product_picture":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/7\/73\/IPhone_3G.png\/250px-IPhone_3G.png",
      "recipient_picture":"https:\/\/www.allianz.com\/static-resources\/de\/presse\/mediendatenbank\/people\/v_1338807733000\/zimerer_portrait_small_326x217.jpg",
      "recipient_username":"jDoe",
      "recipient_id":"12345"
   },
   "product2Id":{
      "product_name":"iPad",
      "product_price":"399.99",
      "product_amount_gifted":"200.00",
      "product_picture":"https:\/\/upload.wikimedia.org\/wikipedia\/en\/thumb\/7\/7c\/1stGen-iPad-HomeScreen.jpg\/220px-1stGen-iPad-HomeScreen.jpg",
      "recipient_picture":"https:\/\/image1.masterfile.com\/em_w\/05\/11\/94\/400-05119409w.jpg",
      "recipient_username":"MJohnson",
      "recipient_id":"67890"
   }
}
4

2 に答える 2

5

parseFull最初に、 が返されることに注意してOptionください。最初のステップは、何かが含まれているかどうかを確認することです (たとえば、解析エラーが発生しました)。これにはパターン マッチングを使用することをお勧めします。

products match {
  case Some(p) => println("Products found")
  case None => println("Error parsing JSON")
}

オプションに実際の値が含まれている場合は、p変数に配置されます。次に、parseFull が を返したことに注意してOption[Any]ください。反復する前にキャストする必要があります。pAny

p.asInstanceOf[Map[String,Map[String,Any]]]

これで、マップを反復処理できるようになりました。次を使用しましょうfor

for {
  (id, desc) <- p.asInstanceOf[Map[String,Map[String,Any]]]
  (propName, propValue) <- desc
} println(propName + "=" + propValue)

シングルループに見えますが、実はダブルループです。外側のマップを繰り返し処理し、各内側のマップに入ります。idループ本体内では、 、descpropNameおよびpropValue変数にアクセスできます。それはおそらくあなたが探しているものです。

スクリプト全体:

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

val json = """{"product1Id":{"..."recipient_id":"67890"}}"""

val products = parseFull(json)

products match {
  case Some(p) => 
    for {
      (id, desc) <- p.asInstanceOf[Map[String,Map[String,Any]]]
      (propName, propValue) <- desc
    } println(propName + "=" + propValue)

  case None => println("Error parsing JSON")
}

幸運を。

于 2012-06-29T03:00:30.940 に答える
2

つまり、ネストされたマップがあります。次のようなものを試してください。

val your_map = product_array.get().asInstanceOf[Map[String,Map[String,Any]]]
for((key1, value1) <- your_map){
    for((key2, value2) <- value1){
        // now use key2 and value2
    }
}
于 2012-06-28T22:25:29.200 に答える