使用lift-json将MongoDB ObjectID作为JSON

时间:2011-12-23 10:34:53

标签: scala mongodb lift-json

我在某些REST API中使用Bowler框架(内部使用lift-json模块进行繁重的工作)并具有以下案例类:

case class Item(_id : ObjectId, name : String, value : String)

当我将此case对象返回给客户端时,我需要为_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

1 个答案:

答案 0 :(得分:0)

这是固定的。需要定义我自己的RenderStrategy类以覆盖格式声明。这篇文章有更多详细信息http://blog.recursivity.com/post/5433171352/how-bowler-does-rendering-maps-requests-to-objects