2013-03-23 135 views
2

我正在将数据传递到我的php脚本使用jQuery的.ajax方法。我将一个非常复杂的JSON对象作为数据传递。在服务器端,我收到的数据都在$_POST变量中全部转换为php格式。如何将数据从JSON转换为php格式

这种转换是如何发生的?它发生在客户端还是服务器端?在这个过程中关联哪些模块。任何来源深入了解完整的过程。

客户端请求:

var data = { 
       foo: 123, 
       bar: 456, 
       rows: [ 
         { 
         column1 : 'hello', 
         column2 : 'hola', 
         column3 : 'bonjour', 
         }, 
         { 
         column1 : 'goodbye', 
         column2 : 'hasta luego', 
         column3 : 'au revoir', 
         }, 
        ], 
       test1:{ 
         test2: { 
           test3: 'baz' 
          } 
        } 
      }; 

$.ajax({ 
     type:   'post', 
     cache:   false, 
     url:   './ajax/', 
     data:   data 
     }); 

在服务器端我的 '$ _ POST' VAR:

Array 
(
    [foo] => 123 
    [bar] => 456 
    [rows] => Array 
     (
      [0] => Array 
       (
        [column1] => hello 
        [column2] => hola 
        [column3] => bonjour 
       ) 

      [1] => Array 
       (
        [column1] => goodbye 
        [column2] => hasta luego 
        [column3] => au revoir 
       ) 

     ) 

    [test1] => Array 
     (
      [test2] => Array 
       (
        [test3] => baz 
       ) 

     ) 

) 

这段代码是从here拍摄。

回答

1

jquery正在将数据转换为HTTP格式。 http://en.wikipedia.org/wiki/POST_%28HTTP%29

此链接显示阵列是如何编码:http://php.net/manual/en/function.http-build-query.php

您可以使用PHP本身产生的HTTP格式。我转换您的阵列到PHP格式:

$data = array( 'foo' => 123, 
       'bar' => 456, 
       'rows' => array( 0 => array('column1' => 'hello', 
               'column2' => 'hola', 
               'column3' => 'bonjour'), 
            1 => array('column1' => 'hello', 
               'column2' => 'hola', 
               'column3' => 'bonjour')), 
       'test1' => array('test2' => array('test3' => 'baz'))); 

然后你就可以生成HTTP如下:

echo http_build_query($data); 

我得到了以下结果:

foo=123&bar=456&rows%5B0%5D%5Bcolumn1%5D=hello&rows%5B0%5D%5Bcolumn2%5D=hola&rows%5B0%5D%5Bcolumn3%5D=bonjour&rows%5B1%5D%5Bcolumn1%5D=hello&rows%5B1%5D%5Bcolumn2%5D=hola&rows%5B1%5D%5Bcolumn3%5D=bonjour&test1%5Btest2%5D%5Btest3%5D=baz 
+0

如何指定嵌套数据?我尝试阅读'multipart/form-data',但无法理解它是如何完成的。 此外,转换必须发生在PHP从HTTP格式到PHP格式。 – 2013-03-23 21:25:41

+0

是的,这是正确的。然后,PHP将HTTP格式转换为其数组格式 - GET,POST或REQUEST。 – 2013-03-23 21:33:53

+0

嵌套数据的任何帮助? – 2013-03-23 21:45:41

1

JSON是一种通用的数据交换格式(支持其规范的所有语言)。 JSON数据是编码的从内存对象到发送它的语言的JSON格式的字符串,并且通过接收它的语言解码(从字符串到对象)。

重要的一点谈论的jQuery和JavaScript的时候是一个JSON的语法类似于JavaScript的,但它实际上更严格比语法常规的JavaScript对象(见:What are the differences between JSON and JavaScript object?)。例如,上面发布的JavaScript对象文字是而不是有效的JSON,因为键和值都没有用引号括起来。另外,技术上没有JSON对象这样的东西。一串JSON数据实际上只是一个写在JavaScript的Object Notation子集中的字符串。因此,PHP的json_encode($ object)函数和jQuery的encodeJSON([Object])函数将把它们各自语言的内存对象转换为一种字符串,这两种语言(当然还有其他语言)都可以接受为数据。 PHP和jQuery中的json_decode($ string)和parseJSON([String])函数分别采用JSON字符串并将其作为对象提交给内存。

+0

但是,如果我们放大,这个过程还有更多的东西,就像@Pe de Leao所说的那样。 – 2013-03-23 21:29:15

+0

啊,HTTP格式与php格式有什么区别? – orb 2013-03-23 21:34:37

+0

@orb - HTTP使用有趣的字符,如:foo = bar&baz = boom&cow = milk&php = hypertext + processor – 2013-03-23 21:38:25

0

jQuery的编码对象数据作为关键值对,例如,如果我们有:

var data = { 
      foo: 123, 
      bar: 456, 
      rows: [ 
        { 
        column1 : 'hello', 
        column2 : 'bonjour', 
        }, 
        { 
        column1 : 'goodbye', 
        column2 : 'au revoir', 
        }, 
       ] 
      }; 

jQuery将该对象编码为以下字符串

foo=123&bar456&rows[][column1]=hello&rows[][column2]=bonjour&rows[][column1]=goodbye&rows[][column2]=au+revoir 

和PHP将转换该字符串进入数组并根据请求将其分配给$ _GET或$ _POST数组。

+0

此外,url编码涉及到客户端,我的意思是关键值对在URL发送到服务器之前被编码 – Jesse 2013-03-23 21:57:16

相关问题