2014-07-24 13 views
6

Nell'esempio riportato nel readme di json4s https://github.com/json4s/json4s#serializing-non-supported-types la corrispondenza funziona solo se i campi sono order {"start": 0, "end": 0}. Se i campi di inizio e fine vengono scambiati, la corrispondenza non funziona. Esiste comunque la possibilità di scrivere la seguente corrispondenza del caso in modo tale che l'ordinamento dei campi JSON non sia importante?Serializzatore personalizzato Json4s con campi non ordinati

case JObject(JField("start", JInt(s)) :: JField("end", JInt(e)) :: Nil) 

risposta

4

non ho usato questa libreria, quindi non sono sicuro se questo è l'approccio giusto: (sono arrivato fino a questo dopo aver trascorso un paio di minuti a guardare i documenti)

class IntervalSerializer extends CustomSerializer[Interval](format => (
    { 
    case x: JObject => 
     x.obj.sortBy { case (k,_) => k } match { 
     case JField("end", JInt(e)) :: JField("start", JInt(s)) :: Nil => 
      new Interval(start = s.longValue(), end = e.longValue()) 
     } 
    }, 
    { 
    case x: Interval => 
     JObject(JField("start", JInt(BigInt(x.startTime))) :: 
     JField("end", JInt(BigInt(x.endTime))) :: Nil) 
    } 
)) 

L'idea è di ordinare i campi in ordine alfabetico e quindi creare la classe Intervallo.

3

Avevo un diverso ma related issue che mi ha fatto scoprire la funzione "estrai" in json4s. Risolve il problema degli ordini.

case x: JObject => 
    Interval((x \ "start").extract[Int],(x \ "end").extract[Int]) 

Se avete bisogno di un esempio più coinvolti, è possibile controllare questo github ticket.

Problemi correlati