play Framework play json

2024-06-20 03:18
文章标签 json framework play

本文主要是介绍play Framework play json,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   概述


    使用JSON的推荐方式是使用 Play 的基于类的JSON库,位于play.api.libs.json下. 

    该库构建于Jerkson之上,它是一个Scala包装者,基于一个超快的基于Java的JSON库,Jackson.

    这种方式的好处是,Java和Scala可以共享同样的库(Jackson),而Scala用户可以享受额外类型安全的好处。 
    play.api.libs.json包中,包含了7个JSON数据类型: 
        JsObject 
        JsNull 
        JsUndefined 
        JsBoolean 
        JsNumber 
        JsArray 
        JsString 
    
    它们都继承自JsValue。 
    
    解析JSON字符串 

    你可以將任何的JSON字符串解析成JsValue。 
?
1
val json : JsValue  = Json.parse(jsonString)

    遍历JSON树


    只要你拥有一个JsValue,你就可以遍历该树。该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],以抛异常的方式处理失败,如果值丢失的话. 

    Scala值转成Json 

    As soon as you have a type class able to transform the Scala type to Json, it is pretty easy to 

    generate any Scala value to Json. For example letʼs create a simple Json object:

    只要你有一个type class 你就能將Scala类型转成Json,很容易將任何的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格式支持的对象,对吧?) 

    简单的选择是將它们做为Seq[JsValue]处理: 
?
1
2
3
val jsonArray  = Json.toJson(Seq(
   toJson( 1 ), toJson( "Bob" ), toJson( 3 ), toJson( 4 )
))
    现在让我们看看最后一个创建更复杂的Json对象的例子: 
?
1
2
3
4
5
6
7
8
9
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结果: 
?
1
2
3
4
5
6
7
8
9
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序列化

    將JsValue转成Json字符串形式很容易: 
?
1
val jsonString : String  = Json.stringify(jsValue)

    其它选择

    上面讨论的基于类型的选择是推荐的形式,当然也不会限制你使用其它JSON库。 
    
    例如,下面是一小段演示怎样將纯Scala对象转成JSON 对象,通过绑定的,基于反射的Jerkson。 
?
1
2
3
4
5
6
7
8
9
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"
     )
   )
)

    处理Json请求


     处理Json请求 

        一个 JSON 请求是一个使用 request body 搭载经验证的JSON内容的 HTTP 请求.它必须指定 Content-Type 为text/json或application/json mime类型。 

    默认Action使用any content body parser,让你以JSON取值得request body 值(实际上是JsValue): 
?
1
2
3
4
5
6
7
8
9
10
11
def sayHello  = Action { request  = >
   request.body.asJson.map { json  = >
     (json \  "name" ).asOpt[String].map { name  = >
       Ok( "Hello " + name)
     }.getOrElse {
       BadRequest( "Missing parameter [name]" )
     }
   }.getOrElse {
     BadRequest( "Expecting Json data" )
   }
}

    更好的方法是自定义BodyParser,请求Play直接將body解析为JSON: 
?
1
2
3
4
5
6
7
def sayHello  = Action(parse.json) { request  = >
   (request.body \  "name" ).asOpt[String].map { name  = >
     Ok( "Hello " + name)
   }.getOrElse {
     BadRequest( "Missing parameter [name]" )
   }
}

    注意:当使用JSON body parser的时候,request.body的值直接做为一个经验证的JsValue值。 

    你可以通过在命令行中用curl测试: 
?
1
2
3
4
5
curl
   --header "Content-type: application/json"
   --request POST
   --data '{"name": "Guillaume"}'
   http://localhost:9000/sayHello

    返回: 
?
1
2
3
4
5
HTTP/ 1.1 200 OK
Content-Type : text/plain; charset = utf- 8
Content-Length : 15
Hello Guillaume

    返回JSON响应


    前面的一些例子,我们接收JSON请求,但我们返回的是text/plain响应。 
    让我们更改为一个有效的HTTP响应: 
?
1
2
3
4
5
6
7
8
9
10
11
def sayHello  = Action(parse.json) { request  = >
   (request.body \  "name" ).asOpt[String].map { name  = >
     Ok(toJson(
       Map( "status" ->  "OK" "message" -> ( "Hello " + name))
     ))
   }.getOrElse {
     BadRequest(toJson(
       Map( "status" ->  "KO" "message" ->  "Missing parameter [name]" )
     ))
   }
}

    现在它返回: 
?
1
2
3
4
5
HTTP/ 1.1 200 OK
Content-Type : application/json; charset = utf- 8
Content-Length : 43
{ "status" : "OK" , "message" : "Hello Guillaume" }

这篇关于play Framework play json的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1076949

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

解决Entity Framework中自增主键的问题

《解决EntityFramework中自增主键的问题》:本文主要介绍解决EntityFramework中自增主键的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Entity Framework中自增主键问题解决办法1解决办法2解决办法3总结Entity Fram

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

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

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

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

MySQL 中的 JSON 查询案例详解

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