需要帮助解决JSON问题

时间:2011-08-30 18:52:58

标签: php arrays logic json

当我尝试将数组转换为json时,我遇到了PHP的这个问题 我有一个递归函数,它构建数组以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”:导致json标记出错。 我想尝试使用preg_replace删除它但我使用正则表达式很糟糕。有人可以帮我... ... D

谢谢你们!


我有个主意...... :)

我一直在寻找测试这些东西的方法...:D 我提出了一个想法,从插件中获取JSON并将其作为一个数组进行ENCODE打印,看看我需要给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基于OBJECTS,我认为它存在错误,当数据作为对象时,我尝试使用数组并转换它。

有人知道如何创造类似的东西吗? 只是一种方式,我可以想...谢谢你们......

:DDD

4 个答案:

答案 0 :(得分:1)

根据jslint.com,这是有效的JSON。它通过验证器就好了。

答案 1 :(得分: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"}

所以,不确定发生了什么。

答案 2 :(得分: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”作为键。它只是一个对象数组。

答案 3 :(得分:-1)

那是因为你不应该将0到5定义为字符串。你应该把它定义为它,所以你甚至不必命名它。像这样:

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