2016-04-26 148 views
0

元素從lift-json集合在Scala中,如何讓地圖

scala> val json = parse(""" 
     { 
      "name": "joe", 
      "addresses": { 
      "address1": { 
       "street": "Bulevard", 
       "city": "Helsinki" 
      }, 
      "address2": { 
       "street": "Soho", 
       "city": "London" 
      } 
      } 
     }""") 
scala> case class Address(street:String, city: String) 
scala> case class PersonWithAddresses(name: String, addresses: Map[String, Address]) 
scala> val joe = json.extract[PersonWithAddresses] 
res0: PersonWithAddresses("joe", Map("address1" -> Address("Bulevard", "Helsinki"), 
            "address2" -> Address("Soho", "London"))) 

我要訪問的joe元素。例如,我想知道Joe的address1 city。怎麼樣?

獎勵題: 如果PersonWithAddresses

case class PersonWithAddress(name:String, addresses: Map[String, List[Address]])

我將如何提取列表的大小?

P.S.問題: joe.addresses("address1").size()joe.addresses.get("address1").size有什麼區別?

+1

'joe.addresses( 「地址1」)。city'和'joe.addresses( 「地址1」)。大小()' – Jesper

+0

天才! 什麼joe.addresses( 「地址1」)之間'的區別。大小()'和' joe.addresses.get( 「地址1」)。size' – salvob

回答

3

你的問題與json沒有任何關係,而且本身就是電梯。你已經有了你的對象,你只是不知道如何使用Scala集合。

如果沒有列表,你可以得到你的城市:

@ joe.addresses("address1") 
res4: Address = Address("Bulevard", "Helsinki") 
@ res4.city 
res5: String = "Helsinki" 

joe.addresses("address1").city的簡稱。

在列表

case class PersonWithAddress(name:String, addresses: Map[String, List[Address]]) 

的情況下,你只需撥打名單size

joe.addresses("address1").size 

至於這兩者之間的區別:

@ res7.addresses("address1").size 
res8: Int = 1 
@ res7.addresses.get("address1").size 
res9: Int = 1 

有一個很大的區別,看到當你調用get

@ res7.addresses.get("address1") 
res10: Option[List[Address]] = Some(List(Address("Bulevard", "Helsinki"))) 

它返回一個Option這可以被看作會發生什麼作爲0或1大小的集合。檢查其大小不是你想要做的。

map.get("key") 

返回Option其是Some(value)如果值存在於地圖,或None如果它不是

map("key")或脫糖map.apply("key")返回與關鍵或異常關聯的項目,如果元件不存在於所述地圖。