scala play框架json隐式case类转换

时间:2013-04-20 14:56:40

标签: json scala playframework case implicit

我正在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 */
        }
    
    }
    
  3. 如果有人可以帮助我,我会很感激。 我所能找到的只是REPL示例,但我遗漏了一些基本的东西 - 在哪里放置所有代码片段?什么是文件结构?

    谢谢, 安德烈。

2 个答案:

答案 0 :(得分:1)

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

请参阅Elements of Scala Style?了解更多详情。

以下是在restful ws中将json转换为scala case类的示例。

在这里输入代码

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

}

答案 1 :(得分:0)

Java和Scala之间不同的一点是Scala不需要特定的文件/文件夹结构。包甚至不必与文件夹对应。此外,每个文件可以有多个类。

基本上,你拥有的很好。

必须保持不变的是进口。所以,如果你问为什么你的东西不能编译,请尝试导入模型包中的所有内容。

import models._