序列化映射没有一个字符串作为带电梯JSON的关键(Serialize a map that does

2019-07-30 07:19发布

这似乎是提升JSON是仅限于具有字符串作为键映射。

什么是绕过这个限制的最佳方式?

Answer 1:

定义你自己的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

就这样。



Answer 2:

除了前面的回答,您可以定义改为:

DEF反序列化(隐式格式:格式):PartialFunction [(所属类别,JValue),地图[任意,不限]] = {地图()}

这不会破坏任何其他工作地图反序列化。



文章来源: Serialize a map that doesn't have a string as a key with lift-json