2016-04-26 55 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")返回与关键或异常关联的项目,如果元件不存在于所述地图。