scala playframework json隐式案例类转换 [英] scala playframework json implicit case class conversion

查看:138
本文介绍了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):

  1. 文件LoginBase.scala

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

    这篇关于scala playframework json隐式案例类转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆