Play 2.0 中文资料 - Play JSON 库
2015-10-26 12:26
453 查看
Play 2.0 中文资料 - Play JSON 库
2013-01-13 — Yanbin使用 JsonPlay Json 库处理 Json 请求
Play Json 库使用泛型概述推荐的处理JSON 的方式是使用 Play 基于 JSON 库的类型类,位置在
play.api.libs.json.这个库是构建于 Jerkson,之上的,它又是基于 Java 的超快的 JSON 库 Jackson 的 Scala 封闭。Unmi 注:在 Play 1.x 所用的 JSON 库是 Gson,而 Play 2.0 后更换成了 Jackson。还得 Play 2.0 是基于 SBT 构建的,所以 Play 2.0 的所有的 jar 都是在 $PLAY_HOME/repository/local 目录中。这样做的好处是无论是 Java 还是 Scala 的 Play 应用依赖了相同的底层库 (Jackson),同时 Scala 用户可以享受到Play’s JSON 所带来的额外的类型安全性.
play.api.libs.json包含有七种 JSON 数据类型:
JsObject
JsNull
JsUndefined
JsBoolean
JsNumber
JsArray
JsString上面的类型都继承自通用的 JSON 值类型,
JsValue.解析 Json 字符串你可很轻易的解析任意的 JSON 字符串为一个
JsValue:
1 | val json : JsValue = Json.parse(jsonString) |
JsValue你就可以遍历这个 Json 树. 这个 API 看起来像是Scala 使用
NodeSeq 进行遍历 XML 文档一样的:
1234 | val json = Json.parse(jsonString) val maybeName = (json \ "user" \ name).asOpt[String] val emails = (json \ "user" \\ "emails" ).map( _ .as[String]) |
asOpt[T]不存在值时会返回
None,所以这时候你需要自己来处理错误. 而用
as[T]时,如果不存在值时就会报出异常.
Unmi 注:对于以上的代码我还需要用代码来加以说明:
01020304050607080910 | val jsonString = "" " {" users ":{ " user 1 ":{" name ":" Unmi ", " ":" fantasia @ sina.com "}, " user 2 ":{" name ":" Unmi.cc ", " ":" unmi @ unmi.cc "} } } " "" val json = Json.parse(jsonString) val maybeName = (json \ "users" \ "user1" \ "name" ).asOpt[String] println(maybeName) val emails = (json \ "users" \\ "email" ).map( _ .as[String]) println(emails) |
[RuntimeException: Stringexpected] 。
继续查看println(json\"users" \"user1" \"nameLaLa") 输出的是null
上面的 Json 是 play.api.libs.json.Json,不是 play.mvc.Json,也不是play.libs.Json,play.libs.Json.parse() 返回的是JsonNode,而 play.mvc.Json 没有
parse() 方法。
\和 \\是定义在play.api.libs.json.Json 中的方法,\和XPath 的 / 相似,直接的属性,\\和 XPath 的 // 相似,子孙属性
前面代码两个 println 语句的输出是:
UnmiList(fantasia@sina.com,unmi@unmi.cc)
对 JSON 字符串的要求还是较严格的,没有 JavaScript 的 JSON 那么随意,属性名一定要加上双引号,单引号都不行。示例中的:
(json\"user" \name).asOpt[String]
name 代表的是前面定义的一个变量,如果是字面常量必须用双引号框上,否则报错:not found: value name。本文原始链接 http://unmi.cc/play2-0-tutorials-cn-play-json-library/,
来自 隔叶黄莺 Unmi Blog转换 Scala 值为 Json只要你有一个能够被转换为 Json 的 Scala 类型,那就会非常容易由 Scala 值生成 Json. 例如我们来创建一个简单的 Json 对象:
1 | val jsonNumber = Json.toJson( 4 ) |
1 | val jsonArray = Json.toJson(Seq( 1 , 2 , 3 , 4 )) |
Seq[Int]转换成 Json 数组是没有问题的. 然而,假如 Seq 包含了不同的类型值是事情就变得复杂了:
1 | val jsonArray = Json.toJson(Seq( 1 , "Bob" , 3 , 4 )) |
Seq[Any]转换为 Json (
Any代表着任何类型,包括 Json 无法支持的类型,不是吗?)Unmi 注: 报错为 No Json deserializer found for type Seq[Any]. Try to implement an implicit Writes or Format for this type.一个简单的解决方案是按照
Seq[JsValue] 来处理:
123 | val jsonArray = Json.toJson(Seq( toJson( 1 ), toJson( "Bob" ), toJson( 3 ), toJson( 4 ) )) |
0102030405060708091011121314151617181920 | val jsonObject = Json.toJson( Map( "users" -> Seq( toJson( Map( "name" -> toJson( "Bob" ), "age" -> toJson( 31 ), "email" -> toJson( "bob@gmail.com" ) ) ), toJson( Map( "name" -> toJson( "Kiki" ), "age" -> toJson( 25 ), "email" -> JsNull ) ) ) ) ) |
0102030405060708091011121314 | { "users" : [ { "name" : "Bob" , "age" : 31.0 , "email" : "bob@gmail.com" }, { "name" : "Kiki" , "age" : 25.0 , "email" : null } ] } |
JsValue为它的 json字符串表示格式很简单:
1 | val jsonString : String = Json.stringify(jsValue) |
01020304050607080910111213141516 | import com.codahale.jerkson.Json. _ val json = generate( Map( "url" -> "http://nytimes.com" , "attributes" -> Map( "name" -> "nytimes" , "country" -> "US" , "id" -> 25 ), "links" -> List( "http://link1" , "http://link2" ) ) ) |
相关文章推荐
- play Framework play json
- js 获取url参数
- 基于javascript实现漂亮的页面过渡动画效果附源码下载
- JSP页面中超链接传递中文参数出现乱码问题解决方法
- javascript 中delete 的作用是干啥的
- JSP中response.setContentType和response.setCharacterEncoding区别分析
- Jsp 入门 - 一个简单的web项目
- 多款优秀的 JS MVC 框架对比
- 你不知道的JavaScript--Item1 严格模式
- 你不知道的JavaScript--Item1 严格模式
- JS实现的页面自定义滚动条效果
- JS与Native交互初识
- JS实现的鼠标跟随代码(卡通手型点击效果)
- DATATable转为json
- C# JS 单例
- JS响应鼠标点击实现两个滑块区间拖动效果
- 利用json2html将json数据填充到html模板
- 利用tempo将json数据填充到html模板
- js 验证码 倒计时60秒
- WdatePicker.js的使用方法 帮助文档 使用说明(时间控件)