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

相关文章

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2