Кажется, что lift-json ограничен картами, в которых есть строки в качестве ключей.Сериализовать карту, которая не имеет нити в качестве ключа с лифтом-json
Каков наилучший способ обойти это ограничение?
Кажется, что lift-json ограничен картами, в которых есть строки в качестве ключей.Сериализовать карту, которая не имеет нити в качестве ключа с лифтом-json
Каков наилучший способ обойти это ограничение?
Определить ваши собственные 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
Это все.
В дополнение к предыдущему ответу можно определить вместо:
Защиту десериализации (неявный формат: форматы): частично определённая функция [(TypeInfo, JValue), Map [Any, Any]] = { Map() }
Это не нарушает никакой десериализации другой рабочей карты.
Не объекты JSON ограничены только строками для ключей? –
Да, объекты JSON ограничены только строками для ключей. Они, как практический вопрос, называют имена методов, поэтому это подходит. –
Да, мой вопрос заключался в том, как вы можете (де) сериализовать карту, которая не имеет строки как ключевой, поскольку существует такое ограничение. – Atol