2013-03-23 137 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

相關問題