5

lift-jsonは、キーとして文字列を持つマップに制限されているようです。

この制限を回避するための最良の方法は何ですか?

4

2 に答える 2

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

それで全部です。

于 2012-07-09T06:25:55.477 に答える
0

前の答えに加えて、代わりに定義することができます:

def deserialize(implicit format:Formats):PartialFunction [(TypeInfo、JValue)、Map [A​​ny、Any]] = {Map()}

これにより、他の作業マップの逆シリアル化が中断されることはありません。

于 2014-05-16T21:45:35.190 に答える