MongoDB ObjectID как JSON с использованием lift-json - PullRequest
0 голосов
/ 23 декабря 2011

Я использую Bowler framework для некоторых REST API (внутренне использует модуль lift-json для тяжелых работ) и имеет следующий класс case:

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 голосов
/ 24 декабря 2011

Это исправлено. Необходим для определения моего собственного класса RenderStrategy, чтобы переопределить объявление форматов. Этот пост содержит более подробную информацию http://blog.recursivity.com/post/5433171352/how-bowler-does-rendering-maps-requests-to-objects

...