【问题标题】:scala playframework json implicit case class conversionscala playframework json隐式案例类转换
【发布时间】:2013-04-13 20:32:24
【问题描述】:

我正在使用 Scala 开发我的第一个 Play 2.1 应用程序。 我要完成的任务是将 json 解析为 3 个不同的案例类。问题是 - 我不知道在哪里声明所有案例类。每个类都在它自己的文件中或全部在一个文件中。这是我所做的(它不起作用,case 值在控制器对象中不可见):

  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 示例,但我缺少一些基本的东西——把所有的代码放在哪里?文件结构是什么?

谢谢, 安德烈。

【问题讨论】:

    标签: json scala playframework case implicit


    【解决方案1】:

    在一个文件中包含多个类和对象在 Scala 中被认为是好的形式,只要这些类紧密相关。

    请参考Elements of Scala Style? 以获得更详细的答案。

    这里是在 restful ws 中将 json 转换为 scala 案例类的示例。

    在此处输入代码

    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)
                })
            )
        }
    
    }
    

    【讨论】:

    • 欢迎来到 SO!请编辑您的答案,为您在此处提出的建议提供一些背景信息。
    【解决方案2】:

    Java 和 Scala 的不同之处在于 Scala 不需要特定的文件/文件夹结构。这些包甚至不必与文件夹相对应。此外,每个文件可以有多个类。

    基本上,你所拥有的一切都很好。

    必须保持不变的是导入。因此,如果您问为什么您的东西无法编译,请尝试导入模型包中的所有内容。

    import models._
    

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多