在JFinal的Controller中接收json数据

简介:

JFinal中接收URL中的参数或者model中的参数是很方便的,但是对于web2.0的网站来说,经常会以json方式提交比较复杂的数据,比如一个查询,包含了各种过滤条件和排序分页,前端脚本可能提交的数据是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
{
     "type" :1,
     "key" : "keyword" ,
     "paging" :{
         "size" :50,
         "index" :0
     },
     "sort" :{
         "field" : "time" ,
         "type" : "desc"
     }
}


像SpringMVC就提供了@RequestBody将数据绑定到json对象上,但是jFinal不支持,需要自己从POST中读取并解析这个json数据,先定义一个与请求同结构的Java对象,比如起名叫QueryRequest:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
packagecom.demo;
 
import  com.demo.Paging;
import  com.demo.Sort;
 
public  class  QueryRequest {
     private  int  type;
     private  String key;
     private  Paging paging;
     private  Sort sort;
 
     public  int  getType() {
         return  type;
     }
     public  void  setType( int  type) {
         this .type = type;
     }
     public  String getKey() {
         return  key;
     }
     public  void  setKey(String key) {
         this .key = key;
     }
     public  Paging getPaging() {
         return  paging;
     }
     public  void  setPaging(Paging paging) {
         this .paging = paging;
     }
     public  Sort getSort(){
         return  sort;
     }
     public  void  setSort(Sort sort){
         this .sort = sort;
     }
}


其中用到了Paging和Sort两个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package  com.demo;
 
public  class  Paging {
     private  int  size;
     private  int  index;
     
     public  int  getSize() {
         return  size;
     }
     public  void  setSize( int  size) {
         this .size = size;
     }
     public  int  getIndex() {
         return  index;
     }
     public  void  setIndex( int  index) {
         this .index = index;
     }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package  com.demo;
 
public  class  Sort {
     private  String field;
     private  String type;
     
     public  String getField() {
         return  field;
     }
     public  void  setField(String field) {
         this .field = field;
     }
     public  String getType() {
         return  type;
     }
     public  void  setType(String type) {
         this .type = type;
     }
}


然后在Controller里就从request中读取json字符串,然后调用fastjson解析提交的数据了,:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Before (POST. class )
public  void  getData(){
     try {
         //从requst中读取json字符串
         StringBuilder json =  new  StringBuilder(); 
         BufferedReader reader =  this .getRequest().getReader();
         String line =  null ;
         while ((line = reader.readLine()) !=  null ){
             json.append(line);
         }
         reader.close();
 
         //调用fastjson解析出对象
         QueryRequest request = JSONObject.parseObject(json.toString(), QueryRequest. class );
         
         //然后就可以使用request得到请求的所有数据了
         //下略
         //.......
     }
     catch (Exception ex){
         //异常处理,略
     }
     
     renderText( "测试" );
}


转换部分会经常使用,可以提出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
  * 取Request中的数据对象
  * @param valueType
  * @return
  * @throws Exception 
  */
protected  <T> T getRequestObject(Class<T> valueType)  throws  Exception {
     StringBuilder json =  new  StringBuilder();
     BufferedReader reader =  this .getRequest().getReader();
     String line =  null ;
     while ((line = reader.readLine()) !=  null ){
         json.append(line);
     }
     reader.close();
     
     return  JSONObject.parseObject(json.toString(), valueType);
}


使用的时候一句就行了:

1
QueryRequest requst = getRequestObject(QueryRequest. class );



另外附上前端ajax调用的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
$.ajax({
     "url" "/home/getDate" ,       //路径
     "cache" false ,               //不缓存
     "async" true ,                //异步
     "type" "POST" ,               //POST方式提交
     "dataType" "json" ,           //json格式,重要
     "contentType" "application/json" ,       //json格式
     "data" : {},                   //要提交的数据对象
     success:  function  (json) {  //成功处理
     },
     error:  function  (x, e) {   //异常处理
     }
});


PS:很喜欢jFinal,相比于SpringMVC庞大的体积,jFinal真是的很小巧。

PPS:使用的是jFinal-2.0,配合fastjson-1.2.3,之前用fastjson-1.2.4时会有问题。




     本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/1698113,如需转载请自行联系原作者




相关文章
|
22天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
9天前
|
JSON JavaScript 前端开发
Haskell中的数据交换:通过http-conduit发送JSON请求
Haskell中的数据交换:通过http-conduit发送JSON请求
|
26天前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
12天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
39 0
|
23天前
|
JSON Java API
Jackson:SpringBoot中的JSON王者,优雅掌控数据之道
【8月更文挑战第29天】在Java的广阔生态中,SpringBoot以其“约定优于配置”的理念,极大地简化了企业级应用的开发流程。而在SpringBoot处理HTTP请求与响应的过程中,JSON数据的序列化和反序列化是不可或缺的一环。在众多JSON处理库中,Jackson凭借其高效、灵活和强大的特性,成为了SpringBoot中处理JSON数据的首选。今天,就让我们一起深入探讨Jackson如何在SpringBoot中优雅地控制JSON数据。
30 0
|
23天前
|
JSON 数据处理 数据格式
Python中JSON结构数据的高效增删改操作
Python中JSON结构数据的高效增删改操作
|
23天前
|
XML JSON 定位技术
在Python中操纵json数据的最佳方式
在Python中操纵json数据的最佳方式
|
25天前
|
JSON API 数据格式
基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架
【8月更文挑战第25天】这段资料介绍了一个使用Python从服务器获取实时天气数据并解析JSON格式数据的基本框架。主要分为三个部分:一是安装必要的`requests`库以发起HTTP请求获取数据,同时利用Python内置的`json`库处理JSON数据;二是提供了具体的代码实现,包括获取天气数据的`get_weather_data`函数和解析数据的`parse_weather_data`函数;三是对代码逻辑进行了详细说明,包括如何通过API获取数据以及如何解析这些数据来获取温度和天气描述等信息。用户需要根据实际使用的天气API调整代码中的API地址、参数和字段名称。
|
26天前
|
JSON 开发工具 数据格式
【Azure Event Hub】Event Hub的Process Data页面无法通过JSON格式预览数据
【Azure Event Hub】Event Hub的Process Data页面无法通过JSON格式预览数据
|
1月前
|
SQL JSON 关系型数据库
"SQL老司机大揭秘:如何在数据库中玩转数组、映射与JSON,解锁数据处理的无限可能,一场数据与技术的激情碰撞!"
【8月更文挑战第21天】SQL作为数据库语言,其能力不断进化,尤其是在处理复杂数据类型如数组、映射及JSON方面。例如,PostgreSQL自8.2版起支持数组类型,并提供`unnest()`和`array_agg()`等函数用于数组的操作。对于映射类型,虽然SQL标准未直接支持,但通过JSON数据类型间接实现了键值对的存储与查询。如在PostgreSQL中创建含JSONB类型的表,并使用`-&gt;&gt;`提取特定字段或`@&gt;`进行复杂条件筛选。掌握这些技巧对于高效管理现代数据至关重要,并预示着SQL在未来数据处理领域将持续扮演核心角色。
29 0