2012-07-08 8 views
5

Wygląda na to, że lift-json jest ograniczony do map, które mają łańcuchy jako klucze.Serializuj mapę, która nie ma łańcucha jako klucza z lift-json

Jaki jest najlepszy sposób na ominięcie tego ograniczenia?

+0

Czy obiekty JSON nie są ograniczone do ciągów tylko dla kluczy? –

+0

Tak, obiekty JSON są ograniczone do posiadania tylko ciągów dla kluczy. Są to, z praktycznego punktu widzenia, nazwy metod, więc pasują. –

+0

Tak, moje pytanie brzmiało: jak możesz (de) serializować mapę, która nie ma ciągu jako klucza, ponieważ istnieje takie ograniczenie. – Atol

Odpowiedz

5

Definiowanie własnego 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.") 
    } 
} 

Następnie dodaj go do niejawnego Formats zmiennej.

implicit val formats = DefaultFormats + MapSerializer 

To wszystko.

0

W uzupełnieniu do poprzedniej odpowiedzi można zdefiniować zamiast:

def deserializowania (formatu niejawny: Formats): funkcja częściowa [(TypeInfo, JValue), Mapa [any, any]] = { mapie() }

Nie powoduje to żadnych innych deserializacji map roboczych.

Powiązane problemy