使用json4s反序列化scala中的BigDecimal返回空列表

时间:2017-08-18 09:23:36

标签: scala bigdecimal json4s

鉴于此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的列表?

1 个答案:

答案 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空列表。