使用lift-json序列化没有字符串作为键的映射

时间:2012-07-08 23:40:38

标签: scala serialization map lift-json

似乎lift-json仅限于以字符串为键的地图。

绕过此限制的最佳方法是什么?

2 个答案:

答案 0 :(得分: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

这就是全部。

答案 1 :(得分:0)

除了上一个答案,你可以改为定义:

def deserialize(隐式格式:格式):PartialFunction [(TypeInfo,JValue),Map [A​​ny,Any]] = {     地图()   }

这并没有打破任何其他工作地图反序列化。