我正在创建一个处理JSON输入的PHP脚本(通过$ _POST变量)。它从JSON中提取数据并将其上传到SQL数据库。我想要特定格式的JSON:
$object = json_decode('{
"key_a":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}],
"key_b":[{"value_a":10,"value_b":7}],
"key_c":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}]
}',true);
基本上,一个带有键的对象,每个对象都应该包含一个数组(无论它的大小是多少)。我使用json_decode(json,true)将其转换为关联数组(而不是对象)。我必须为每个键添加大量检查,检查它们是否是对象或数组(作为提取来自将具有单个对象的数组转换为对象的ASP.net页面 - 删除数组抱着他们)。然后检查将它们转换回数组,如果有一个对象我喜欢一个持有对象的数组:
if(is_object($object["key_b"]))
{
$a = array();
$a[] = $object["key"];
$object["key"] = $a;
}
然后我遍历数组,将值添加到SQL数据库中的行。这一切都很好,但是当使用json_encode转换回JSON时,任何包含只有一个对象的数组的键,删除数组,只留下该键下的对象:
echo(json_encode($object));
// RETURNED JSON
'{
"key_a":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}],
"key_b":{"value_a":10,"value_b":7},
"key_c":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}]
}'
你看,key_b不再拥有一个数组,而是一个对象!这真的很烦人,因为我计划创建一个迭代数组的JavaScript脚本,为每个对象添加一个DOM元素(div)。
为什么会这样?有没有办法将它们保存为数组,即使数组中只有一个对象?
我试过了:
if(is_object($object["key_b"]))
{
$a = array();
$a[] = array_values($object["key"]);
$object["key"] = $a;
}
和
if(is_object($object["key_b"]))
{
$a = array();
$a[0] = array_values($object["key"]);
$object["key"] = $a;
}
但似乎没有什么能阻止json_encode以这种方式影响JSON。
解决这个问题并不困难 - 但这意味着每个键添加一个检查(检查它是否是数组或值),这是特别耗时的,因为通过的数据提取非常大。
非常感谢任何建议。
编辑:在JSON中将'更改为' - 但这只是我刚才写的一个示例,用于显示结构。
编辑:我正在使用引用来减少编码时间,如果这改变了什么?:
$t =& $object["key_b"];
if(is_object($t))
{
$a = array();
$a[] = $t;
$t = $a;
}
答案 0 :(得分:0)
在关联数组的键上使用is_object()似乎不会返回true。我刚刚敲了这个例子来证明这一点:
$json = json_decode('{"job_details":{"a":[{"x":5},{"y":23},{"z":18}],"b":{"x":19},"c":[{"x":64},{"y":132}]}}',true);
echo(json_encode($json)."<br><br>");
$t =& $json["job_details"]["b"];
if(is_object($t))
{
$a = array();
$a[] = $t;
$t = $a;
echo("IS OBJECT<br><br>");
}
echo(json_encode($json));
我将找到另一种方法来检查关联数组键中的值。
我实际上是在尝试查找键中的值是否为关联数组(不是对象) - 我只是没有意识到它们在PHP中有所不同。
我必须使用这个自定义函数:
function is_assoc($array)
{
return (bool)count(array_filter(array_keys($array), 'is_string'));
}
来自:How to check if PHP array is associative or sequential?
如果值是关联数组,则返回true。