2011-08-30 193 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 –