我在一些REST API中使用Bowler框架(内部使用lift-json模块进行繁重的提升),并有以下case类:
case class Item(_id : ObjectId, name : String, value : String)
当我返回这个案例对象回到客户端,我需要包括_id字段的值。但是,_id列在Json输出中作为空列表返回,而不是其实际值。
{"_id":{},"name":"Id Test","value":"id test"}
任何关于如何解决这个问题的指针将不胜感激。
更新:我尝试使用自定义序列化器,但由于某种原因,它没有被调用!
class ObjectIdSerializer extends Serializer[ObjectId] {
private val Class = classOf[ObjectId]
def deserialize(implicit format: Formats) = {
case (TypeInfo(Class, _), json) => json match {
case JObject(JField("_id", JString(s)) :: Nil) => new ObjectId(s)
case x => throw new MappingException("Can't convert " + x + " to ObjectId")
}
}
def serialize(implicit format: Formats) = {
case x: ObjectId => { println("t @@@@@@@@Custom Serializer was called!"); JObject(JField("_id", JString(x.toString)) :: Nil)}
}
}
implicit val formats = DefaultFormats + new ObjectIdSerializer
这是固定的。需要定义我自己的RenderStrategy类,以便覆盖格式声明。这篇文章有更多的细节http://blog.recursivity.com/post/5433171352/how-bowler-does-rendering-maps-requests-to-objects