Создать неявное чтение json для коллекции List, которая может отсутствовать во входном json

Я следую за play-salat (github.com/leon/play-salat), чтобы создать модель для ввода json и сохранить ее в mongodb. Как я могу создать неявное чтение json для коллекции List, которое может отсутствовать во входном json? Следующий код дает мне ошибку проверки, если "позиции" отсутствуют во входном json.

case class LIProfile(
  id: ObjectId = new ObjectId,
  positions: List[Position] = Nil
)

object LIProfile extends LIProfileDAO with LIProfileJson

trait LIProfileDAO extends ModelCompanion[LIProfile, ObjectId] {
  def collection = mongoCollection("liprofiles")
  val dao = new SalatDAO[LIProfile, ObjectId](collection) {}

  // Indexes
  collection.ensureIndex(DBObject("emailAddress" -> 1), "li_profile_email", unique = true)

  // Queries
  def findOneByEmail(email: String): Option[LIProfile] = dao.findOne(MongoDBObject("emailAddress" -> email))
}


trait LIProfileJson {

  implicit val liprofileJsonWrite = new Writes[LIProfile] {
    def writes(p: LIProfile): JsValue = {
      Json.obj(
        "id" -> p.id,
        "positions" -> p.positions
      )
    }
  }
  implicit val liprofileJsonRead = (
    (__ \ 'id).read[ObjectId] ~
    (__ \ 'positions).read (
            (__ \ 'values).read[List[Position]]
            ) 
  )(LIProfile.apply _)
}

1 ответ

Решение

Использование readNullable для того, чтобы получить Option и сопоставьте это с содержащимся списком или пустым списком.

implicit val liprofileJsonRead = (
  (__ \ 'id).read[ObjectId] ~
  (__ \ 'positions).readNullable (
    (__ \ 'values).read[List[Position]]
  ).map {
    case Some(l) => l
    case None => Nil
  }
)(LIProfile)

или даже короче

implicit val liprofileJsonRead = (
  (__ \ 'id).read[ObjectId] ~
  (__ \ 'positions).readNullable (
    (__ \ 'values).read[List[Position]]
  ).map { l => l.getOrElse(Nil) }
)(LIProfile)

Я не совсем уверен, какой импорт вам действительно нужен, мой код компилируется с использованием:

import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
Другие вопросы по тегам