2017-08-18 4 views
0

Compte tenu de cette JSON:Deserialize BigDecimal à scala avec json4s retour liste vide

{ 
    "id": "1", 
    "details": [{ 
     "tax": [{ 
      "amount": 1 
     }, 
     { 
      "amount": 2 
     }] 
    }] 
} 

Je suis en train de le lire ainsi:

lazy val amounts: List[BigDecimal] = parse(json) \\ "amount" \ classOf[JDecimal] 

Mais il me donne une liste vide, alors que en utilisant JDouble comme ceci:

lazy val amounts: List[Double] = parse(json) \\ "amount" \ classOf[JDouble] 

Il me donne la liste correcte.
Comment puis-je lire directement une liste de BigDecimals?

Répondre

1

Peu de temps vous pouvez le résoudre en utilisant la méthode extract avec l'objectif type pour cette conversion, comme:

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

Explication:

Lors de la lecture amounts il est le type d'élément est JInt pas JDecimal,

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

comme vous pouvez le voir, tapez JInt pour le amounts.

et pour extraire par class Type:

def \[A <: JValue](clazz: Class[A]): List[A#Values] = 
    findDirect(jv.children, typePredicate(clazz) _).asInstanceOf[List[A]] map { _.values } 

il est predicating par clazz, mais le type d'élément de amounts est JInt, il est donc retourne une liste vide.