Search code examples
scalaserializationdictionarylift-json

Serialize a map that doesn't have a string as a key with lift-json


It seems like lift-json is limited to maps that have Strings as keys.

What is the best way to bypass this limitation ?


Solution

  • Define your own 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.")
      }
    }
    

    Then add it to the implicit Formats variable.

    implicit val formats = DefaultFormats + MapSerializer
    

    That's all.