express.js来自GET请求的4个JSON解析问题(来自数据表的请求数据)

时间:2014-12-05 16:31:35

标签: json parsing express datatables

我在解析序列化JSON Ajax Get请求时遇到问题(使用jQuery $ .ajax)发送到我的express.js 4服务器。作为JSON请求发送的数据由数据表生成。

以下是我在客户端开始的方式

$(document).ready(function() {
    $('#example').dataTable( {
        "bServerSide": true,
        "fnServerData": function (sSource, aoData, fnCallback) {
            $.ajax({
                "dataType": 'json',
                contentType: 'application/json',
                "type": "GET",
                "url": "http://localhost:3000/ajax/phenotypes/withOrg/like/datatables/",
                "data": aoData,
                "success": fnCallback,
                "error": function () {
                    alert('have some problem');
                }
            });
        }                   
    } );
} );

当我在brower数据表中加载此代码时,生成以下GET请求URL(到服务器):

  

GET   / AJAX /表型/ withOrg /像/数据表/绘制= 1&安培;柱=%5Bobject +对象%5D%2C%5Bobject +对象%5D%2C%5Bobject +对象%5D%2C%5Bobject +对象%5D%2C %5Bobject +对象%5D%2C%5Bobject +对象%5D与秩序=%5Bobject +对象%5D&安培;开始= 0&安培;长度= 10安培;搜索=%5Bobject +对象%5D

或以解码形式(来自萤火虫的输出)

 columns    [object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
    draw    1
    length  10
    order   [object Object]
    search  [object Object]
    start   0

所以我在发送

之前序列化了数据
$(document).ready(function() {
            $('#example').dataTable( {
                "bServerSide": true,
                "fnServerData": function (sSource, aoData, fnCallback) {
                    var myData = JSON.stringify(aoData);
                    $.ajax({
                        "dataType": 'json',
                        contentType: 'application/json',
                        "type": "GET",
                        "url": "http://localhost:3000/ajax/phenotypes/withOrg/like/datatables/",
                        "data": myData,
                        "success": fnCallback,
                        "error": function () {
                            alert('have some problem');
                        }
                    });
                }                   
            } );
        } );

这是从数据表中生成的GET参数:

  

GET   / AJAX /表型/ withOrg /像/数据表/ [{%22name%22:%22draw%22%22value%22:1}?,{%22name%22:%22columns%22%22value%22:[{ %22data%22:0,%22name%22:%22%22%22searchable%22:真,%22orderable%22:真,%22search%22:{%22value%22:%22%22%22regex% 22:假}},{%22data%22:1,%22name%22:%22%22%22searchable%22:真,%22orderable%22:真,%22search%22:{%22value%22:% 22%22%22regex%22:假}},{%22data%22:2,%22name%22:%22%22%22searchable%22:真,%22orderable%22:真,%22search%22: {%22value%22:%22%22%22regex%22:假}},{%22data%22:3,%22name%22:%22%22%22searchable%22:真,%22orderable%22:真,%22search%22:{%22value%22:%22%22%22regex%22:假}},{%22data%22:4,%22name%22:%22%22%22searchable%22:真,%22orderable%22:真,%22search%22:{%22value%22:%22%22%22regex%22:假}},{%22data%22:5,%22name%22:%22% 22,%22searchable%22:真,%22orderable%22:真,%22search%22:{%22value%22:%22%22%22regex%22:假}}]},{%22name%22:% 22order%22%22value%22:[{%22column%22:0,%22dir%22:%22asc%22}]},{%22name%22:%22start%22%22value%2 2:0},{%22name%22:%22length%22%22value%22:10},{%22name%22:%22search%22%22value%22:{%22value%22:%22%22 ,%22regex%22:假}}]   HTTP / 1.1

以解码的形式(使用在线工具进行输出并使用jslint进行美化,看起来是正确的!)

[
   {
      "name":"draw",
      "value":1
   },
   {
      "name":"columns",
      "value":[
         {
            "data":0,
            "name":"",
            "searchable":true,
            "orderable":true,
            "search":{
               "value":"",
               "regex":false
            }
         },
         {
            "data":1,
            "name":"",
            "searchable":true,
            "orderable":true,
            "search":{
               "value":"",
               "regex":false
            }
         },
         {
            "data":2,
            "name":"",
            "searchable":true,
            "orderable":true,
            "search":{
               "value":"",
               "regex":false
            }
         },
         {
            "data":3,
            "name":"",
            "searchable":true,
            "orderable":true,
            "search":{
               "value":"",
               "regex":false
            }
         },
         {
            "data":4,
            "name":"",
            "searchable":true,
            "orderable":true,
            "search":{
               "value":"",
               "regex":false
            }
         },
         {
            "data":5,
            "name":"",
            "searchable":true,
            "orderable":true,
            "search":{
               "value":"",
               "regex":false
            }
         }
      ]
   },
   {
      "name":"order",
      "value":[
         {
            "column":0,
            "dir":"asc"
         }
      ]
   },
   {
      "name":"start",
      "value":0
   },
   {
      "name":"length",
      "value":10
   },
   {
      "name":"search",
      "value":{
         "value":"",
         "regex":false
      }
   }
]

现在的问题是,无法在快速4服务器端解析此字符串化的URL 我使用express4 req.query和url.parse方法:http://expressjs.com/api.html#req.query 然后尝试使用JSON.parse()方法解析收到的json字符串

...
var url = require('url');
...

 router.get('/withOrg/like/datatables/', function (req, res) {
    console.log('getting json string via req.query');
    console.log(req.query);
    console.log('output parsed json object using JSON.parse');
    console.log(JSON.parse(req.query));

    //another try
    console.log('for stack overflows test 2');
    console.log(url.parse(req.url, true).query);
    console.log('output parsed json object using JSON.parse');
    console.log(url.parse(req.url, true).query);
})

两个json字符串输出结果都是无效的json,你可以在这里看到并且无法用JSON.parse解析:

getting json string via req.query
  

{   ' {"数据":0,"名称":"""搜索":真,"可订购& #34;:真,"搜索" {"值":"""正则表达式":假}},{&# 34;数据":1,"名称":"""搜索":真,"可订购":真,& #34;搜索" {"值":"""正则表达式":假}},{"数据&#34 ;: 2,"名称":"""搜索":真,"可订购":真,"搜索" :{"值":"""正则表达式":假}},{"数据":3,"名称& #34;:"""搜索":真,"可订购":真,"搜索" {"值& #34;:"""正则表达式":假}},{"数据&#34:4,"名称"#34& ;""搜索":真,"可订购":真,"搜索" {"值":&#34 ;""正则表达式":假}},{"数据":5,"名称":"",& #34;搜索":真,"可订购":真,"搜索" {"值":"",& #34;正则表达式":假}}&#39 ;:   {' {"列":0," dir":" asc"}':'' }}

output parsed json object using JSON.parse

getting json string via req.query
  

{   ' {"数据":0,"名称":"""搜索":真,"可订购& #34;:真,"搜索" {"值":"""正则表达式":假}},{&# 34;数据":1,"名称":"""搜索":真,"可订购":真,& #34;搜索" {"值":"""正则表达式":假}},{"数据&#34 ;: 2,"名称":"""搜索":真,"可订购":真,"搜索" :{"值":"""正则表达式":假}},{"数据":3,"名称& #34;:"""搜索":真,"可订购":真,"搜索" {"值& #34;:"""正则表达式":假}},{"数据&#34:4,"名称"#34& ;""搜索":真,"可订购":真,"搜索" {"值":&#34 ;""正则表达式":假}},{"数据":5,"名称":"",& #34;搜索":真,"可订购":真,"搜索" {"值":"",& #34;正则表达式":假}}&#39 ;:   {' {"列":0," dir":" asc"}':'' }}

output parsed json object using JSON.parse

当我尝试解析json字符串时,我从JSON.parse

中得到错误
SyntaxError: Unexpected token o
    at Object.parse (native)
    at module.exports (/Users/xxx/yyy/routes/phenotypesAJAX.js:16:19)
    at Layer.handle [as handle_request] (/Users/xxx/yyy/node_modules/express/lib/router/layer.js:82:5)
    at next (/Users/xxx/yyy/node_modules/express/lib/router/route.js:100:13)

这是快递4中的错误吗? 我看不出问题出在哪里。在客户端,序列化数据表GET请求似乎有效(使用JSLint检查)。在express4服务器端,我找不到任何其他方式以不同的方式解析GET请求。

非常感谢你的帮助, 奥利弗

1 个答案:

答案 0 :(得分:0)

我在快递github bugtracker上发布了这个问题的答案。 学过的知识: 我想复杂,express.js请求方法不是特别针对特定的请求格式编写的!他们只是使用发送给他们的数据格式而不做任何修改!

我首先使用的方法:

req.query 
  

[..]仅适用于标准查询字符串,它们是键=值对,   您提供的URL不是。[..]

解决我问题的正确方法是:

  url.parse(req.url).query

返回URL的完整参数字符串,该字符串必须手动解码:

  obj = JSON.parse(decodeURIComponent(query))

以下是完整的解释: https://github.com/strongloop/express/issues/2460