2012-07-08 10 views
5

Sembra che lift-json sia limitato alle mappe che hanno stringhe come chiavi.Serializzare una mappa che non ha una stringa come chiave con lift-json

Qual è il modo migliore per superare questa limitazione?

+0

Gli oggetti JSON non hanno solo stringhe per le chiavi? –

+0

Sì, gli oggetti JSON sono limitati ad avere solo stringhe per le chiavi. Sono, in pratica, i nomi dei metodi, quindi è appropriato. –

+0

Sì, la mia domanda era come si può (de) serializzare la mappa che non ha lo string come chiave poiché c'è questa limitazione. – Atol

risposta

5

Definire il proprio Serializer[Map[Any, Any]].

import net.liftweb.json._ 
import ext._ 

object MapSerializer extends Serializer[Map[Any, Any]] { 
    def serialize(implicit format: Formats): PartialFunction[Any, JValue] = { 
    case m: Map[_, _] => JObject(m.map({ 
     case (k, v) => JField(
     k match { 
      case ks: String => ks 
      case ks: Symbol => ks.name 
      case ks: Any => ks.toString 
     }, 
     Extraction.decompose(v) 
    ) 
    }).toList) 
    } 

    def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), Map[Any, Any]] = { 
    sys.error("Not interested.") 
    } 
} 

quindi aggiungerlo alla Formats variabile implicita.

implicit val formats = DefaultFormats + MapSerializer 

Questo è tutto.

0

Oltre alla risposta precedente è possibile definire invece:

def deserializzare (formato implicita: Formati): funzione parziale [(TypeInfo, JValue), Mappa [Qualsiasi, Qualsiasi]] = { Mappa() }

Ciò non interrompe qualsiasi altra deserializzazione della mappa di lavoro.