鉴于此json:
{
"id": "1",
"details": [{
"tax": [{
"amount": 1
},
{
"amount": 2
}]
}]
}
我试图以这种方式阅读它:
lazy val amounts: List[BigDecimal] = parse(json) \\ "amount" \ classOf[JDecimal]
但它正在给我一个空列表,同时使用JDouble
这样:
lazy val amounts: List[Double] = parse(json) \\ "amount" \ classOf[JDouble]
它给了我正确的清单。
如何直接阅读BigDecimals
的列表?
答案 0 :(得分:1)
您很快就可以使用extract
方法将目标type
用于此转化,例如:
val amounts = parse(json) \ "details" \ "tax" \ "amount"
implicit val formats = DefaultFormats
val decimals = amounts.extract[List[BigDecimal]]
> List(1, 2)
<强>解释强>
阅读amounts
时,其元素类型为JInt
而不是JDecimal
,
val amounts = parse(json) \ "details" \ "tax" \ "amount"
> JArray(List(JInt(1), JInt(2)))
您可以看到JInt
的{{1}}类型。
并按amounts
类型提取:
class
def \[A <: JValue](clazz: Class[A]): List[A#Values] =
findDirect(jv.children, typePredicate(clazz) _).asInstanceOf[List[A]] map { _.values }
predicating
,但clazz
的元素类型为amounts
,因此它会返回JInt
空列表。