来自lift-json:
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
之间的区别是什么?
0 < x < 1
?
答案 0 :(得分: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")
或desugared map.apply("key")
将返回与键或例外关联的项目。