2012-07-08 8 views
5

看來lift-json僅限於以字符串作爲關鍵字的地圖。使用lift-json序列化一個沒有字符串作爲關鍵字的地圖

繞過此限制的最佳方法是什麼?

+0

是不是隻限JSON對象只有鍵的字符串? – 2012-07-09 00:04:55

+0

是的,JSON對象被限制爲只有鍵的字符串。實際上,它們是方法名稱,所以它很合適。 – 2012-07-09 01:11:50

+0

是的,我的問題是你怎麼能(de)序列化沒有字符串作爲關鍵字的地圖,因爲有這個限制。 – Atol 2012-07-09 01:14:25

回答

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 

就這樣。

0

除了前面的回答,您可以代替定義:

高清反序列化(隱式格式:格式):PartialFunction [(所屬類別,JValue),地圖[任何,任何] = { 地圖() }

這不會破壞任何其他工作映射的反序列化。

相關問題