2012-07-08 7 views
5

lift-jsonは文字列をキーとして持つ地図に限られているようです。文字列を持たない地図をlift-jsonでキーとしてシリアル化

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

+0

JSONオブジェクトはキー用の文字列のみに制限されていませんか? –

+0

はい、JSONオブジェクトはキー用の文字列のみを持つように制限されています。彼らは実用的な問題として、メソッド名なので適合します。 –

+0

はい、私の質問は、この制限があるため、キーとして文字列を持たないマップをどのようにシリアル化できますか(de)です。 – Atol

答えて

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 

これだけです。

をDEF(暗黙的なフォーマット形式の)デシリアライズ:部分写像[(のTypeInfo、JValue)、マップ[でも、任意] = { マップ() かわりに定義することができ、以前の回答に加えて

0

}

これは、他の作業マップのデシリアライズを解除しません。