阶playframework JSON隐情况下类转换(scala playframework jso

2019-10-18 01:11发布

我发展在斯卡拉我第一次玩2.1的应用程序。 我试图完成的任务是JSON解析成3层不同情况下的类。 问题是 - 我不知道在哪里申报所有情况下类。 在它的每个类的自己的文件或全部在一个文件中。 这里是我做了什么(这是行不通的,案例值不在控制器对象可见):

  1. 文件LoginBase.scala

     package models abstract class LoginBase case class Login(email: String, password: String) extends LoginBase case class RestoreLogin(email: String, captchaID: String, captchaAnswer: String) extends LoginBase case class RegisterLogin(email: String, password: String, captchaID: String, captchaAnswer: String) extends LoginBase 
  2. 文件

     package controllers import play.api._ import play.api.mvc._ import play.api.data._ import play.api.data.Forms._ import play.api.Play.current import play.api.cache.Cache import play.api.libs.json._ import play.api.mvc._ import play.api.libs.functional.syntax._ import nl.captcha.Captcha import nl.captcha.Captcha._ import nl.captcha.gimpy.FishEyeGimpyRenderer import nl.captcha.text.renderer.ColoredEdgesWordRenderer import nl.captcha.text.renderer.DefaultWordRenderer import nl.captcha.gimpy.DropShadowGimpyRenderer import java.io.ByteArrayOutputStream import javax.imageio.ImageIO import java.util.UUID import play.api.libs.functional.syntax._ import models.LoginBase object LoginActions extends Controller { implicit val loginReads = ( (__ \ "email").read[String] and (__ \ "password").read[String] )(Login.apply _) implicit val restoreLoginReads = ( (__ \ "email").read[String] and (__ \ "captchaID").read[String] and (__ \ "captchaAnswer").read[String] )(RestoreLogin) implicit val registerLoginReads = ( (__ \ "email").read[String] and (__ \ "password").read[String] and (__ \ "captchaID").read[String] and (__ \ "captchaAnswer").read[String] )(RegisterLogin) def registerLogin = Action(parse.json){ /* To be implementd */ } } 

如果有人能帮助我,我会感激。 所有我能找到的是REPL的例子,但我错过了一些基本的东西 - 在那里把所有的代码块? 什么是文件结构?

谢谢你,安德烈。

Answer 1:

有一个单一的文件内的多个类和对象被认为是斯卡拉的好形式,只要类密切相关。

请参阅斯卡拉风格的要素? 对于更详细的回答。

下面是示例在宁静的WS转换JSON来阶情况下的类。

在这里输入代码

import play.api.libs.json.{Reads, JsError, Json}
import play.api.libs.json.JsValue

object someController e

xtends Controller{

case class SomeResource(val Id:String, val someType:String, val Serialno:String)

implicit val reads:Reads[SomeResource] = Json.reads[SomeResource]

/**
   * save some object
   */
  def someService = Action(parse.json){request=>
    unmarshalOrderResource(request, (resource: SomeResource) => {
            val someValue = SomeResource(resource.Id,
                            resource.someType,resource.Serialno);
            someservice.save(someValue);
            Created(someValue.Id)
        })
  }


// method
 private def unmarshalOrderResource(request: Request[JsValue],
                                      block: (SomeResource) => Result): Result = {
        request.body.validate[SomeResource].fold(
            valid = block,
            invalid = (e => {
                val error = e.mkString
                Logger.error(error)
                BadRequest(error)
            })
        )
    }

}


Answer 2:

其中之一就是Java和斯卡拉之间不同的事情之一是,斯卡拉不需要特定的文件/文件夹结构。 该套餐甚至没有对应的文件夹。 此外,你可以为每个文件的多个类。

基本上,你有什么是好的。

必须保持不变的东西是进口的。 所以,如果你要问,为什么你的东西就不会编译,尝试在车型导入包一切。

import models._


文章来源: scala playframework json implicit case class conversion