2011-08-30 236 views
2

我在PHP中遇到這個問題,當我嘗試將數組轉換爲json時 我有一個遞歸函數,它構建數組並將其編碼爲jSon格式。JSON問題需要幫助

這就是數組:

$data = array(
    array('id' => 1, 'parent_id' => null, 'text' => 'lorem ipsum'), 
    array('id' => 2, 'parent_id' => 1, 'text' => 'lorem ipsum1'), 
    array('id' => 3, 'parent_id' => 1, 'text' => 'lorem ipsum2'), 
    array('id' => 4, 'parent_id' => 2, 'text' => 'lorem ipsum3'), 
    array('id' => 5, 'parent_id' => 3, 'text' => 'lorem ipsum4'), 
    array('id' => 6, 'parent_id' => null, 'text' => 'lorem ipsum5'), 
); 

這就是我的功能:

function trataArray($data) { 


$itemsByReference = array(); 

// Build array of item references: 
foreach ($data as $key => &$item) { 
    $itemsByReference[$item['id']] = &$item; 
    // Children array: 
    $itemsByReference[$item['id']]['children'] = array(); 
    // Empty data class (so that json_encode adds "data: {}") 
    $itemsByReference[$item['id']]['data'] = new StdClass(); 
} 

// Set items as children of the relevant parent item. 
foreach ($data as $key => &$item) 
    if ($item['parent_id'] && isset($itemsByReference[$item['parent_id']])) 
     $itemsByReference [$item['parent_id']]['children'][] = &$item; 

// Remove items that were added to parents elsewhere: 
foreach ($data as $key => &$item) { 
    if ($item['parent_id'] && isset($itemsByReference[$item['parent_id']])) 
     unset($data[$key]); 
} 

// Encode: 
return $data; 

}

那是我的JSON,但此JSON有錯誤:

{ 
    "0": // Problem here... T_T 
    { 
     "id": 1, 
     "parent_id": null, 
     "name": "lorem ipsum", 
     "children": [ 
      { 
       "id": 2, 
       "parent_id": 1, 
       "name": "lorem ipsum1", 
       "children": [ 
        { 
         "id": 4, 
         "parent_id": 2, 
         "name": "lorem ipsum3", 
         "children": [], 
         "data": {} 
        } 
       ], 
       "data": {} 
      }, 
      { 
       "id": 3, 
       "parent_id": 1, 
       "name": "lorem ipsum2", 
       "children": [ 
        { 
         "id": 5, 
         "parent_id": 3, 
         "name": "lorem ipsum4", 
         "children": [], 
         "data": {} 
        } 
       ], 
       "data": {} 
      } 
     ], 
     "data": {} 
    }, 
    "5": // And here... T_T 
    { 
     "id": 6, 
     "parent_id": null, 
     "name": "lorem ipsum5", 
     "children": [], 
     "data": {} 
    } 
} 

琴絃「0」:和「5」:都是ca在json標記中使用錯誤。 我認爲嘗試使用preg_replace刪除它,但我很糟糕的正則表達式工作。有人可以幫助我吧...:D

謝謝你們!


我有一個想法... :)

我一直在尋找各種方法來測試變薄屎...:d 。我來這裏有一個想法,從插件和ENCODE得到JSON它作爲一個數組並打印出來,看看我需要給JSON Encode來給我正確的東西。

他們,他重現:

Array 
(
    [0] => stdClass Object 
     (
      [id] => 1 
      [text] => City 
      [children] => Array 
       (
        [0] => stdClass Object 
         (
          [id] => 11 
          [text] => Wyoming 
          [children] => Array 
           (
            [0] => stdClass Object 
             (
              [id] => 111 
              [text] => Albin 
             ) 

            [1] => stdClass Object 
             (
              [id] => 112 
              [text] => Canon 
             ) 

            [2] => stdClass Object 
             (
              [id] => 113 
              [text] => Egbert 
             ) 

           ) 

         ) 

        [1] => stdClass Object 
         (
          [id] => 12 
          [text] => Washington 
          [state] => closed 
          [children] => Array 
           (
            [0] => stdClass Object 
             (
              [id] => 121 
              [text] => Bellingham 
             ) 

            [1] => stdClass Object 
             (
              [id] => 122 
              [text] => Chehalis 
             ) 

            [2] => stdClass Object 
             (
              [id] => 123 
              [text] => Ellensburg 
             ) 

            [3] => stdClass Object 
             (
              [id] => 124 
              [text] => Monroe 
             ) 

           ) 

         ) 

       ) 

     ) 

) 

的JSON其上的對象的基礎上,我認爲它的存在的bug,IM tryng使用數組的工作,並將其轉換,當數據的對象。

有人知道如何創建類似的東西? 只是一個方式我能想到的...謝謝傢伙...

:DDD

+0

而不是將整個東西轉換成JSON,使用一個循環,並將每個迭代轉換成JSON。 – Ibu

+1

p.s.使用'foreach()'引用時要非常小心;看到這個評論的例子:http://www.php.net/manual/en/control-structures.foreach.php#101425 – ken

+1

我會認爲刪除「1」和「5」會使它無效的JSON。爲什麼不按照你希望JSON數據結構來構建原始數據結構,而不是試圖將一個數據結構轉換成完全不同的數據結構? – dqhendricks

回答

1

根據jslint.com,這是有效的JSON。它通過驗證器就好了。

+0

問題是即時通訊使用需要接收JSON數據而不是「0」的js插件樹:和「5」: –

+0

是的,那個json,減去你的評論,是有效的。你怎麼知道它的無效?或者說是什麼問題導致/錯誤消息。 –

+0

它不返回任何錯誤,只是不顯示樹。如果我刪除這些「0」:和「5」:它完美的作品。 –

-1

這是因爲你不應該將0到5定義爲字符串。你應該把它定義爲int,所以你甚至不需要命名它。就像這樣:

[ 
     { 
      // This will be 0 
     }, 
     { 
      // This will be 1, and so on 
     } 
] 
+0

之前我打印它使用echo json_encode($ data); 字符串0和5(我認爲)是由PHP添加的,而不是由函數添加的,所以設置0到5爲字符串將無濟於事 –

0

嘗試這樣的事:

var $counter = 0; 
foreach ($data as $key => &$item) { 
    $itemsByReference[$counter] = &$item; 
    // Children array: 
    $itemsByReference[$counter]['children'] = array(); 
    // Empty data class (so that json_encode adds "data: {}") 
    $itemsByReference[$counter]['data'] = new StdClass(); 

    $counter++; 
} 

這樣,你不創建關聯數組和編碼後,它不應該給你的「0」和「5」鍵。它只是一個對象數組。

+0

不起作用... 謝謝,但仍然在打印0和5在JSON ... –

1

你是怎麼看到這個錯誤的?

將您的JSON直接粘貼到<script>塊中並在瀏覽器中加載會在IE和Chrome中引發錯誤,但是,首先將相同的JSON分配給變量會阻止任何錯誤消息。 Closure Compiler證實了這些發現;當你的裸JSON通過編譯運行時,它失敗。當引入一個簡單的變量賦值時,一切都編譯好。

似乎有一些JS的詞彙規則,我不知道這是影響這個;可悲的是,我不確定究竟是什麼根源。

此外,我不知道你是如何生產生成的JSON。我的意思是,我知道您使用的是json_encode(),但無論我使用陣列鍵做什麼,我都無法使用PHP中的數組重新生成輸出

我希望模仿這個:

{"0": "foo"} 

然而,使用PHP數字鍵名將意味着最終JSON將是一個數組;例如:

json_encode(array(0 => 'foo')); 
> (string) ["foo"] 
json_encode(array("0" => 'foo')); 
> (string) ["foo"] 

,我可以重新創建你的JSON的唯一方法是通過執行以下操作:

$x = new stdClass; 
$x->{"0"} = 'foo'; 
json_encode($x); 
> (string) {"0": "foo"} 

所以,我想無論是你的榜樣是不完整/誤導/錯誤的,或者你在PHP中發現了一些極其晦澀的錯誤。

導入空間的關鍵,而其他排列像下面這樣,也不會產生你的JSON:

json_encode(array("0 " => 'foo')); 
> (string) {"0 ": "foo"} 

json_encode(array(" 0" => 'foo')); 
> (string) {" 0": "foo"} 

json_encode(array("00" => 'foo')); 
> (string) {"00": "foo"} 

json_encode(array(false => 'foo')); 
> (string) ["foo"] 

json_encode(array(null => 'foo')); 
> (string) {"": "foo"} 

json_encode(array("" => 'foo')); 
> (string) {"": "foo"} 

所以,不知道發生了什麼事。

+0

我會嘗試將它歸因於一個var,但我不認爲它是來自PHP的錯誤,正如@Michael所說的,我提供的JSON是有效的。我認爲它是一個來自我使用的插件的錯誤,並不接受JSON的有效性。 正如我所說,id不會給我任何錯誤。 T_T –

+0

我不認爲這是與你解析JSON的問題,因爲在IE和Chrome中的本地語法分析器都處理它 - 只要所有的空格被刪除。當你說,「字符串」0「:和」5「:導致JSON標記錯誤。」,你是什麼意思? **你在哪裏看到它「在json標記上導致錯誤」?** – ken

+0

想象一下,你開發一個插件,並且開發人員需要傳遞和輸入數據類型,你選擇了JSON。但是你的函數需要一個有效的JSON,你的函數需要和有效的JSON,以及一個與你的模式相對應的JSON。 這就是我的問題,它的JSON是有效的,但插件使用模式和「0」:和「5」:正在打破模式。 這裏它的插件和JSON,他的工作: http://jeasyui.com/easyui/demo/combotree.html http://jeasyui.com/easyui/demo/tree_data.json –