本文来自: http://fair-jm.iteye.com/ 转截请注明出处
一不小心 一个月没写文了 这个笔记整理也一直搁了好久...哎...
lz实习也稳定下来 现在就做做小需求啊什么的~
最近lz也办了开源力量一年的会员打算学点东西 届时会有些笔记之类的~~
JSON处理主要用到:
play.api.libs.json
包中的对象和类
JsValue及子类:
■ JsString
■ JsNumber Int,Long,Double 有隐式转换
■ JsBoolean
■ JsObject Seq[(String,JsValue)]
■ JsArray Seq[JsValue]做参数
■ JsNull
以上这些代表了json的组成元素 可以直接用以上的类来构建JSON
Json对象提供了一些方便的工具
toJson方法
val product = Json.obj( "name" -> JsString("Blue Paper clips"), "ean" -> JsString("12345432123"), "description" -> JsString("Big box of paper clips"), "pieces" -> JsNumber(500), "manufacturer" -> Json.obj( "name" -> JsString("Paperclipfactory Inc."), "contact_details" -> Json.obj( "email" -> JsString("contact@paperclipfactory.example.com"), "fax" -> JsNull, "phone" -> JsString("+12345654321") ) ), "tags" -> Json.arr( JsString("paperclip"), JsString("coated") ), "active" -> JsBoolean(true) )
如果想将JsValue(及子类对象)转化为String
可以用:
val productJsonString = Json.stringify(product) //用JsValue的toString方法也可以 会调用这个方法
对象到JSON:
toJson方法可用于 String Option[Int] 以及 Map[String,String]
要实现其他类别的 可以继承Writes覆写writes方法
对于case class 也可以用Json提供的方法在运行时生成相应的Writes:
implicit val productWrites = Json.writes[Product]
也可以用Path
JSON到Object:
前者是Writes 现在是Reads
用JsValue的as方法 Reads由JsPath生成:
此外也可以使用asOpt 那么返回的将是一个Option
implicit val reads:Reads[Product] = ( (JsPath \ "ean").read[Long] and (JsPath \ "name").read[String] and (JsPath \ "description").read[String] )(Product.apply _)
(用JsPath也可以生成Writes 把read换成write即可)
从String->JsValue 用Json.parse
在request中也可以用request.body.asJson 得到一个Option[JsValue]
如果Action只处理JSON的数据 可以写成:
def postProduct2() = Action(parse.json) { request => val jsValue = request.body // Do something with the JSON }
如果content-type不符合(text/json 或者 application/json)就会直接返回400 Bad Request 可以使用parse.tolerantJson如果没有设置content-type的话
用jsValue的validate方法可以检查是否可以转换(用隐式的Reads作为参数):
val age = jsValue.validate[Int] // == JsError val name = jsValue.validate[String] // == JsSuccess(Johnny,) import Json._ val json: JsValue = toJson(Map( "name" -> toJson("Johnny"), "age" -> toJson(42), "tags" -> toJson(List("constructor", "builder")), "company" -> toJson(Map( "name" -> toJson("Constructors Inc.")))))
处理:
val name = (json \ "name").as[String] val age = (json \ "age").asOpt[Int] val companyName = (json \ "company" \ "name").as[String] val firstTag = (json \ "tags")(0).as[String] val allNames = (json \\ "name").map(_.as[String])
如果不符合 不会抛出异常 会返回JsUndefined(也是JsValue的子类) 或者也可以用asOpt返回Option
可以用模式匹配处理:
(json \ "name") match { case JsString(name) => println(name) case JsUndefined(error) => println(error) case _ => println("Invalid type!") }
Format
Reads和Writes可以合并 用Format
Format[T]继承自Reads[T]和Writes[T]
然后使用JsPath的format和formatNullable方法:
import play.api.libs.json._ import play.api.libs.functional.syntax._ implicit val productFormat = ( (JsPath \ "name").format[String] and (JsPath \ "description").formatNullable[String] and (JsPath \ "purchase_price").format[BigDecimal] and (JsPath \ "selling_price").format[BigDecimal] )(PricedProduct.apply, unlift(PricedProduct.unapply))
或者用现有的Reads和Writes:
implicit val productFormat = Format(productReads, productWrites)
对于case class 也可以用运行时生成的方式:
implicit val productFormat = Json.format[PricedProduct]
这种方式是用scala macro生成的 类型安全 对应的还有Json.reads()和Json.writes
检查
检查: 可以在reads中写规则 这些规则来自:play.api.libs.json.ConstraintReads
implicit val companyReads: Reads[Company] = ( (JsPath \ "name").read[String] and (JsPath \ "contact_details").read( ( (JsPath \ "email").readNullable[String](email) and (JsPath \ "fax").readNullable[String](minLength[String](10)) and (JsPath \ "phone").readNullable[String](minLength[String](10)) )(Contact.apply _)) )(Company.apply _)
验证用JsValue的validate方法 和Form的bindFromRequest类似:
def save = Action(parse.json) { implicit request => val json = request.body json.validate[Product].fold( valid = { product => Product.save(product) Ok("Saved") }, invalid = { errors => BadRequest(JsError.toFlatJson(errors)) }) }
相关推荐
Play Framework2是一个强大的Java和Scala应用开发框架,它以其简洁的API、快速的开发周期以及对Web标准的紧密集成而闻名。本教程旨在为初学者和有经验的开发者提供全面的指导,帮助他们掌握Play Framework2的核心...
Play Framework 是一个开源的Web应用框架,主要针对Java和Scala开发者设计,它的核心理念是简化开发流程,提高开发效率,并且特别强调了RESTful架构风格。这个“playframework中文教程.zip”压缩包很可能是为了帮助...
- **异步处理**:书中通过多个示例展示了如何利用 Play Framework 的异步处理能力提高应用性能。 - **WebSocket 支持**:介绍了如何利用 WebSocket 实现服务器与客户端之间的双向实时通信。 - **缓存机制**:探讨...
2. **异步编程**:Play Framework基于Akka框架,支持非阻塞I/O和异步处理,提高了Web应用的并发性能。 3. **路由系统**:Play Framework的路由文件定义了URL到Action的映射,允许开发者灵活地控制请求处理逻辑。 4...
Play Framework框架的控制器负责处理请求和响应。该控制器可以处理HTTP请求,支持Ajax和离线存储,提供了灵活的路由配置。 八、Play Framework框架的模板引擎 Play Framework框架的模板引擎负责渲染页面。该模板...
- 提供了一系列辅助库,例如加密、邮件发送、XML/JSON处理等功能。 6. **Play Session** - Play的session不依赖于HttpSession,避免了中间状态的存储和资源消耗问题,实现"无共享"架构,提高性能。 7. **模板...
7. **RESTful API支持**:Play Framework鼓励使用RESTful设计原则来构建Web服务,提供了一套强大的工具来处理HTTP请求和响应,支持JSON和XML数据格式,便于构建现代Web应用。 8. **强大的测试支持**:Play ...
书中探讨了如何结合 Play Framework 与其他大数据处理技术(如 Apache Spark)来构建高效的数据处理平台。 #### 五、总结 《Play Framework Cookbook》不仅是一本技术手册,更是一部集理论知识与实践经验于一体的...
play2-war-plugin, 用于 Play Framework 2.x的WAR插件 用于 Play Framework 2.x的 WAR插件Current versions: Play 2.2.x : 1.2.1 Play 2.3.0 -> 2.3.1 : 1.3-beta1 (Scala 2.1
2. **异步编程模型**: Play使用Akka Actor系统进行异步处理,这意味着它可以处理大量并发请求,提高应用程序的性能。这种非阻塞I/O方式使得Play特别适合构建高并发的Web应用。 3. ** MVC 架构**:Play遵循MVC设计...
Play Framework是一款基于Java和Scala的开源Web应用框架,它遵循模型-视图-控制器(MVC)架构模式,旨在提供高效、简洁且可测试的开发环境。标题中的"v2.7.9"指的是该框架的特定版本,通常每个新版本会包含性能优化...
1. Play Framework 介绍 2. 创建和发布 Play 应用 2.1 创建 Play 的工程 2.2 Play 常用指令 2.3 Play 应用的 JVM 调优 3. 如何读取静态资源 4. Play框架的配置文件 5. 使用 Play 框架开发 Java 应用 5.1 HTTP...
playframework javaweb playframework javaweb
PlayFramework是一个高性能的Java和Scala框架,它支持Web应用的快速开发,并且主要面向RESTful应用程序。在PlayFramework中,为了确保数据的准确性和合法性,通常会在数据保存到数据库之前,对HTTP请求中的参数进行...
Mastering Play Framework for Scala
《Play Framework 2.0 - 创建你的第一个应用程序》 Play Framework 2.0 是一个开源的Web应用框架,它基于Scala和Java语言,遵循“模式-动作”(Action)架构,提供了一种轻量级、敏捷开发的方式。本篇文章将引导你...
7. **模块化设计**:Play 社区提供了丰富的插件和模块,开发者可以根据需求选择或自定义,如Anorm(一个轻量级的SQL库)和/play2-auth(认证和授权模块)。 8. **JSON支持**:在许多现代Web应用中,JSON是最常见的...
play framework2.01上半部分。
- **实现方法**:使用Play Framework 的路由机制和控制器来设计RESTful API,并通过JSON/XML等格式提供数据。 #### 七、利用验证能力 - **知识点概述**:Play Framework 集成了强大的数据验证功能,帮助开发者确保...