如何在我的Play2 scala应用程序中执行json读取和写入时排除值
发布时间:2020-12-16 18:28:04 所属栏目:安全 来源:网络整理
导读:我在浏览: http://www.playframework.com/documentation/2.1.1/ScalaJsonCombinators和搜索 用于在执行读写操作时如何排除值.它可能在那里,但我不能 找到它. 所以,假设我有一个案例类预订,有一堆参数,一个creationTime和bookingId.当从对象写入Json时,我想
我在浏览:
http://www.playframework.com/documentation/2.1.1/ScalaJsonCombinators和搜索 用于在执行读写操作时如何排除值.它可能在那里,但我不能 找到它. 所以,假设我有一个案例类预订,有一堆参数,一个creationTime和bookingId.当从对象写入Json时,我想编写所有参数但是当从Json读取对象时,例如当在我的控制器中创建POST时: def createBooking = Action(parse.json) { implicit request => { request.body.validate[Booking].map { case (booking) => { Logger.info("" + booking) Ok("ONLY TEST") } }.recoverTotal { e => BadRequest("Detected error:" + JsError.toFlatJson(e)) } } } 我不想在Json POST中提供值creationTime和bookingId,我不想用我的Reads impl读取值: package models.booking import java.util.UUID import org.joda.time.{DateTime} import play.api.libs.functional.syntax._ import play.api.libs.json._ case class Booking (bookingId: UUID,rId: Long,creationTime: DateTime,user: User,dateTime: BookingTime,numOfGuest: Int,status: BookingState.BookingState) { def accepted(): Booking = { this.copy(status = BookingState.ACCEPTED) } def sent(): Booking = { this.copy(status = BookingState.SENT) } def denied(): Booking = { this.copy(status = BookingState.DENIED) } def denyWithNewTimeSuggestion(): Booking = { this.copy(status = BookingState.DENIED_NEW_TIME_SUGGESTED) } def timeout(): Booking = { this.copy(status = BookingState.TIMED_OUT) } def sendOnOpening(): Booking = { this.copy(status = BookingState.ON_HOLD) } } object Booking { implicit object UUIDFormat extends Format[UUID] { def writes(uuid: UUID): JsValue = JsString(uuid.toString()) def reads(json: JsValue): JsResult[UUID] = json match { case JsString(x) => JsSuccess(UUID.fromString(x)) case _ => JsError("Expected UUID as JsString") } } val pattern = "yyyy-M-dd" implicit val dateFormat = Format[DateTime](Reads.jodaDateReads(pattern),Writes.jodaDateWrites(pattern)) import utils.EnumUtils.enumReads implicit val bookingStateReads = enumReads(BookingState) import play.api.libs.json.Reads._ implicit val bookingReads: Reads[Booking] = ( (__ "bookingId").read[UUID] and (__ "rId").read[Long] and (__ "creationTime").read[DateTime] and (__ "user").read[User] and (__ "dateTime").read[BookingTime] and (__ "numOfGuest").read[Int] and (__ "status").read[BookingState.BookingState] )(Booking.apply _) import utils.EnumUtils.enumWrites import play.api.libs.json.Writes._ implicit val bookingWrites: Writes[Booking] = ( (__ "bookingId").write[UUID] and (__ "rId").write[Long] and (__ "creationTime").write[DateTime] and (__ "user").write[User] and (__ "dateTime").write[BookingTime] and (__ "numOfGuest").write[Int] and (__ "status").write[BookingState.BookingState] )(unlift(Booking.unapply)) } object BookingState extends Enumeration { type BookingState = Value val NEW = Value("NEW") val SENT = Value("SENT") val ACCEPTED = Value("ACCEPTED") val DENIED = Value("DENIED") val DENIED_NEW_TIME_SUGGESTED = Value("DENIED_NEW_TIME_SUGGESTED") val TIMED_OUT = Value("TIMED_OUT") val ON_HOLD = Value("ON_HOLD") } 如何指定排除值bookingId和creationTime的customBookingReads. 解决方法
经过一番深思熟虑,我意识到在这种情况下,预订和请求实际上是两个不同的东西,因此我不应该尝试将这两个混合起来.
我创建了一个BookingRequest,可以从中创建预订. 预约申请: case class BookingRequest(rId: Long,bookingTime: BookingTime,numOfGuest: Int) { def createBooking(): Booking = { Booking(UUID.randomUUID(),this.rId,new DateTime(),this.user,this.bookingTime,this.numOfGuest,BookingState.NEW) } } object BookingRequest { import play.api.libs.json.Reads._ implicit val bookingRequestReads: Reads[BookingRequest] = ( (__ "rId").read[Long] and (__ "user").read[User] and (__ "bookingTime").read[BookingTime] and (__ "numOfGuest").read[Int] )(BookingRequest.apply _) import play.api.libs.json.Writes._ implicit val bookingRequestWrites: Writes[BookingRequest] = ( (__ "rId").write[Long] and (__ "user").write[User] and (__ "bookingTime").write[BookingTime] and (__ "numOfGuest").write[Int] )(unlift(BookingRequest.unapply)) } 控制器: def createBooking = Action(parse.json) { implicit request => { request.body.validate[BookingRequest].map { case (bookingRequest) => { Logger.info("Booking" + bookingRequest) Logger.info("BookingRequest" + bookingRequest.createBooking()) // SAVE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Ok(Json.obj("status" -> "OK")) } }.recoverTotal { e => BadRequest(Json.obj("status" ->"KO","message" -> JsError.toFlatJson(e))) } } } 但我仍然很好奇如何在执行读取和写入时排除值 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |