/ / comment convertir JString en Int avec json4s - json, scala, json4s

comment convertir JString en Int avec json4s - json, scala, json4s

nous sommes récemment passés de Jerkson à json4, nous avons vite découvert que le comportement par défaut de désérialisation de ces deux bibliothèques était loin d'être identique.

Un des problèmes que nous rencontrons est que nous recevons parfois une entrée JSON où un champ de numéro est représenté par une chaîne au lieu d'un nombre

//example json object with string representation of "id"
{
"id" : "12545"
}


//example json object with number representation of "id"
{
"id" : 12345
}

ces besoins doivent être désérialisés dans la classe suivante

case class example(id:Int)

c'est notre configuration générale pour désérialiser json en classes arbitraires

import org.json4s.native.Serialization._
import org.json4s._
import org.json4s.native.JsonMethods._

object Json {
implicit val formats = DefaultFormats
def parse[T](json:String)(implicit mf: Manifest[T]):T =  {
org.json4s.native.JsonMethods.parse(input).extract[T]
}
}

mais chaque fois que nous essayons d'analyser l'objet json avec une représentation sous forme de chaîne de l'identifiant qu'il lève et une exception avec le message:

Aucune valeur utilisable pour les offres Aucune valeur utilisable pour id Je ne sais pas comment convertir JString (12545) en int

J'ai cherché un moyen de définir unlecteur personnalisé pour les champs Integer où il tente d’analyser les chaînes dans Integer, mais je n’ai pas encore trouvé de solution qui couvre notre cas d’utilisation. Nous avons besoin d’une solution globale permettant de prendre en charge les applications existantes.

Quelqu'un sait comment y parvenir?

Réponses:

6 pour la réponse № 1

Merci, j'ai fini avec cet objet sérialiseur:

object StringToLong extends CustomSerializer[Long](format => ({ case JString(x) => x.toLong }, { case x: Long => JInt(x) }))
implicit val formats = DefaultFormats + StringToLong

3 pour la réponse № 2

Je vais juste poster la solution que j’ai trouvée avec un Serializer personnalisé pour les entiers

import org.json4s.native.Serialization._
import org.json4s._
import org.json4s.native.JsonMethods._
import org.json4s.native.Serialization._

object Json {

implicit val formats = Serialization.formats(NoTypeHints) + new NumberSerializer()

def parse[T](json:String)(implicit mf: Manifest[T]):T =  {
org.json4s.native.JsonMethods.parse(input).extract[T]
}
}

class NumberSerializer extends CustomSerializer[Int](format => (
{
case JInt(x) => x.toInt
case JDouble(x) => x.toInt
case JString(x) => x.toInt
},
{
case x: Int => JInt(x)
}
))