json_encode将一个值更改为对象的数组

时间:2014-09-05 15:11:37

标签: php json

我正在创建一个处理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;
}

1 个答案:

答案 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。