前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Play Scala 2.5.x - Play JSON开发指南

Play Scala 2.5.x - Play JSON开发指南

作者头像
joymufeng
发布2018-05-17 15:48:33
1.1K0
发布2018-05-17 15:48:33
举报
文章被收录于专栏:Play & Scala 技术分享

1 JSON开发简介

Play提供了一套基于jackson开发的JSON库,帮助开发者便捷地处理JSON数据。目前Play的JSON库可以实现以下功能:

  • 自动完成JSON对象和case class之间的双向转换
  • 验证JSON数据的合法性
  • 直接作为HTTP的请求/响应数据,方便开发RESTful服务

目前Play的JSON库已经分离成独立项目,所以你可以很容易地将它引入到自己的项目:

代码语言:javascript
复制
libraryDependencies += "com.typesafe.play" %% "play-json" % playVersion

2 基本JSON类型

JsValuetrait是所有基本JSON类型的父类型,JSON库提供的基本类型如下:

  • JsString
  • JsNumber
  • JsBoolean
  • JsObject
  • JsArray
  • JsNull

在日程开发中,我们很少跟这些JSON基本类型打交道。因为在Play中对于基本类型T(例如String, Int, ...)以及Seq[T]已经提供了默认的隐式转换, 可以自动将其转换成对应的JSON类型,例如:

代码语言:javascript
复制
//基本类型值
Json.obj("name" -> JsString("joymufeng"))
//可以简写成:
Json.obj("name" -> "joymufeng")

//序列类型值
Json.obj("emails" -> JsArray(Seq(JsString("a"), JsString("b"))))
//可以简写成:
Json.obj("emails" -> Seq("a", "b"))

在Play的JSON库里,整形和浮点型都使用JsNumber表示,这是一个略为糟糕的设计,因为会导致JSON数据无法在多语言环境下共享。例如通过Java代码向MongoDB写入了一个整形数值,但是经过Play的JSON库修改后变成了浮点型,Java代码再次读取时便会报错。

3 基本的JSON操作

  • 构建一个JsObject对象 //直接构建 val json = Json.obj( "name" -> "joymufeng", "emails" -> Json.arr("joymufeng@163.com"), "address" -> Json.obj( "province" -> "JiangSu", "city" -> "NanJing" ) ) //从JSON字符串构建 val json = Json.parse(""" { "name": "joymufeng", "emails": ["joymufeng@163.com"], "address": { "province": "JiangSu", "city" -> "NanJing" } } """)
  • 常用操作 //read props val city = (json \ "address" \ "city").as[String] val cityOpt = (json \ "address" \ "city").asOpt[String] val emails = (json \ "emails").as[List[String]] //mutable var obj = Json.obj("a" -> 1) obj ++= Json.obj("b" -> 2) //obj: {"a":1,"b":2} //pretty print val prettyStr = Json.prettyPrint(obj)

4 JSON对象和case class互转

Play虽然为基本类型T以及Seq[T]提供了默认的隐式转换,但是case class的隐式转换需要我们自己声明,例如我们有如下两个case class:

代码语言:javascript
复制
case class Address(province: String, city: String)
case class Person(name: String, emails: List[String], address: Address)

我们只需要声明两个隐式的Format对象就可以了:

代码语言:javascript
复制
    import play.api.libs.json._
    implicit val addressFormat = Json.format[Address]
    implicit val personFormat = Json.format[Person]

    //case class -> JSON object
    val person = Person("joymufeng", List("joymufeng@163.com"), Address("JiangSu", "NanJing"))
    val json = Json.toJson[Person](person)

    //JSON object -> case class
    val p1 = Json.fromJson[Person](json).get
    val p2 = json.as[Person]
    val p3 = json.asOpt[Person].get

我们发现Json.fromJson[Person](json)返回的类型并不是Person而是JsResult[Person],这是因为从JSON object到case class的转换可能会发生错误,JsResult有两个子类JsSuccessJsError,分别用来处理成功和失败两种情况:

代码语言:javascript
复制
    Json.fromJson[Person](json) match {
      case p: JsSuccess[Person] => println(p)
      case e: JsError => println(e.errors)
    }

5 小结

随着NoSQL的不断普及,JSON数据在Web开发中显得越来越重要。使用Play提供的JSON库可以大大简化日常的开发工作。另外还有一些基于JSON库的第三方模块,例如Play-ReactiveMongo,利用该模块将Play和MongoDB完美结合,开发出高性能的异步非阻塞系统。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 JSON开发简介
  • 2 基本JSON类型
  • 3 基本的JSON操作
  • 4 JSON对象和case class互转
  • 5 小结
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档