2012-07-08 9 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),地图[任何,任何] = { 地图() }

这不会破坏任何其他工作映射的反序列化。

相关问题