2017-08-18 132 views
0

鑑於此JSON:反序列化的BigDecimal與json4s斯卡拉返回空列表

{ 
    "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

不久,您可以通過使用extract方法與目標type此轉換,喜歡解決它:

val amounts = parse(json) \ "details" \ "tax" \ "amount" 
    implicit val formats = DefaultFormats 
    val decimals = amounts.extract[List[BigDecimal]] 
    > List(1, 2) 

說明:

當讀amounts它的元素類型爲JIntJDecimal

val amounts = parse(json) \ "details" \ "tax" \ "amount" 
> JArray(List(JInt(1), JInt(2))) 

因爲你可以看到它的JInt類型爲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,所以它會返回一個空列表。