2012-07-08 6 views
5

Кажется, что lift-json ограничен картами, в которых есть строки в качестве ключей.Сериализовать карту, которая не имеет нити в качестве ключа с лифтом-json

Каков наилучший способ обойти это ограничение?

+0

Не объекты JSON ограничены только строками для ключей? –

+0

Да, объекты JSON ограничены только строками для ключей. Они, как практический вопрос, называют имена методов, поэтому это подходит. –

+0

Да, мой вопрос заключался в том, как вы можете (де) сериализовать карту, которая не имеет строки как ключевой, поскольку существует такое ограничение. – Atol

ответ

5

Определить ваши собственные 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.") 
    } 
} 

Затем добавьте его в неявной Formats переменной.

implicit val formats = DefaultFormats + MapSerializer 

Это все.

0

В дополнение к предыдущему ответу можно определить вместо:

Защиту десериализации (неявный формат: форматы): частично определённая функция [(TypeInfo, JValue), Map [Any, Any]] = { Map() }

Это не нарушает никакой десериализации другой рабочей карты.