Play 2.0 中文资料 - Play JSON 库

2024-06-20 03:18
文章标签 json 中文 资料 play 2.0

本文主要是介绍Play 2.0 中文资料 - Play JSON 库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Play 2.0 中文资料 - Play JSON 库

2013-01-13 — Yanbin
  • 使用 Json
    • Play 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)

遍历  Json 树

一旦你得到了一个 JsValue 你就可以遍历这个 Json 树. 这个 API 看起来像是  Scala 使用 NodeSeq 进行遍历 XML 文档一样的:

1
2
3
4
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 注:对于以上的代码我还需要用代码来加以说明:

01
02
03
04
05
06
07
08
09
10
       val jsonString  = "" " {" users ":{
                  " user 1 ":{" name ":" Unmi ", " email ":" fantasia @ sina.com "},
                  " user 2 ":{" name ":" Unmi.cc ", " email ":" 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)

如果试图访问不存在的属性,如 (json \ "users"  \ "user1"  \ "userLaLa").asOpt[String] 时不会报错,得到的是 None 值。而换成 (json \ "users"  \ "user1"  \ "userLaLa").as[String] 就会有异常 [RuntimeException: String expected] 。

继续查看  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 语句的输出是:

Unmi
List(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 )

或者创建一个 json 数组:

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] 来处理:

1
2
3
val jsonArray  = Json.toJson(Seq(
   toJson( 1 ), toJson( "Bob" ), toJson( 3 ), toJson( 4 )
))

现在我们最后来看一个创建复杂 Json 对象的例子:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
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
         )
       )
     )
   )
)

上面产生的 Json 结果是:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
{
   "users" : [
     {
       "name" : "Bob" ,
       "age" : 31.0 ,
       "email" : "bob@gmail.com"
     },
     {
       "name" : "Kiki" ,
       "age" :   25.0 ,
       "email" : null
     }
   ]
}

序列化 Json

序列一个 JsValue 为它的 json 字符串表示格式很简单:

1
val jsonString : String  = Json.stringify(jsValue)

其他选择

虽然我们推荐用上面方案所描述的类型类(Unmi 注: typeclass 意思是?), 但是没什么能阻止用户有需求时去使用其他的 JSON 库.

例如, 这里一个小片段演示了使用基 Jerkson 库的 bundled, 反射机制,来编组原始的 scala 对象成 JSON 并进行传输:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
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 2.0 中文资料 - Play JSON 库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076953

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

php中json_decode()和json_encode()

1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool $assoc ] ) 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 参数 json

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

特殊JSON解析

一般的与后台交互;都会涉及到接口数据的获取;而这里的数据一般情况就是JSON 了;JSON 解析起来方便;而且数据量也较小一些;所以JSON在接口数据返回中是个很不错的选择。 下面简单说下JSON解析过程中的一些案例: 这里我用到了三方的架包:fastjson-1.1.39.jar 架包 可以在我的博客中找到下载;或者网上找下 很多的; 这里主要就是映射  关系了;这就要求:实体类的名称和

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

IEEE会议投稿资料汇总http://cadcg2015.nwpu.edu.cn/index.htm

最近投了篇IEEE的顶级会议文章,一下是比较有用的一些资料,以供参考。 1.会议主页:http://cadcg2015.nwpu.edu.cn/index.htm     (The 14th International Conference on Computer-Aided Design and Computer Graphics (CAD/Graphics 2015)) 2.I

ansible资料

ansible系列教程-强烈推荐看完ansible官方编写的例子ansible_uiJenkins配置ansiblegalaxy官方文档中文教程1中文教程2playbook进阶YAML语法fabric编写的自动化部署