/ / come convertire JString in Int con json4s - json, scala, json4s

come convertire JString in Int con json4s - json, scala, json4s

siamo passati da Jerkson a json4s, abbiamo presto scoperto che il comportamento di de-serializzazione predefinito di queste due librerie è lontano dallo stesso.

uno dei problemi che abbiamo è che a volte riceviamo input JSON dove un campo numerico è rappresentato come una stringa invece di un numero

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


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

questi devono essere deserializzati nella seguente classe

case class example(id:Int)

questa è la nostra impostazione generale per deserializzare Json in classi arbitrarie

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]
}
}

ma ogni volta che tentiamo di analizzare l'oggetto JSON con la rappresentazione di stringa dell'ID che genera e l'eccezione con il messaggio:

Nessun valore utilizzabile per le offerte Nessun valore utilizzabile per l'ID Non so come convertire JString (12545) in int

Ho cercato un modo per impostare unlettore personalizzato per i campi Integer in cui tenta di analizzare stringhe in Interiers ma devo ancora trovare una soluzione che copra il nostro caso d'uso. Quello di cui abbiamo bisogno è una soluzione generale di catch per supportare le applicazioni legacy.

Qualcuno sa come raggiungerlo?

risposte:

6 per risposta № 1

Grazie, ho finito con questo oggetto serializzatore:

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

3 per risposta № 2

Pubblicherò appena la soluzione che ho trovato dove uso un serializzatore personalizzato per gli interi

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)
}
))