scala playframework json隐式案例类转换
我正在Scala中开发我的第一个Play 2.1应用程序. 我要完成的任务是将json解析为3个不同的案例类.问题是-我不知道在哪里声明所有案例类.它自己的文件中的每个类或一个文件中的所有类.这是我所做的事情(它不起作用,case值在控制器对象中不可见):
I am developing my first Play 2.1 application in Scala. The task I am trying to accomplish is to parse json into 3 different case classes. The problem is - I do not know where to declare all case classes. Each class in it's own file or all in one file. Here is what I've done (it doesn't work, case values are not visible in controller object):
-
文件LoginBase.scala
File 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
文件
File
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示例,但是我缺少一些基本的东西-将所有代码放在哪里?什么是文件结构?
If someone can help me with this, I'll appreciate. All I can find is REPL examples, but I am missing some fundamental stuff - where to put all the pieces of code? what is the file structure?
谢谢, 安德烈
在单个文件中具有多个类和对象,在类中被认为是良好的形式,只要这些类紧密相关即可.
Having multiple classes and objects inside a single file is considered good form in Scala, as long as the classes are tightly related.
请参考 Scala风格的元素?了解更多详细答案.
please refer Elements of Scala Style? for more detail answer.
这里是在平稳的ws中将json转换为scala case类的示例.
Here is example of converting json to scala case class in restful ws.
在此处输入代码
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)
})
)
}
}