Создать неявное чтение 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._