当我尝试将数组转换为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
答案 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
}
]