【发布时间】:2018-05-28 16:42:02
【问题描述】:
我正在尝试将 json_encode 输出为:{"match_all":{}}。 我写的示例程序是:
<?php
$qarray=Array("match_all"=>Array());
print_r(json_encode($qarray));
?>
但上面给了我下面的o/p: {"match_all":[]}
【问题讨论】:
我正在尝试将 json_encode 输出为:{"match_all":{}}。 我写的示例程序是:
<?php
$qarray=Array("match_all"=>Array());
print_r(json_encode($qarray));
?>
但上面给了我下面的o/p: {"match_all":[]}
【问题讨论】:
在 PHP 中,array 可以将字符串作为键(也称为关联数组),当 JSON 编码时,它会转换为 JSON 对象({})。但是,如果该数组只有数字键,则该数组被编码为 JSON 数组 - list ([])。
要创建一个空的 JSON 对象,您需要在 PHP 中创建一个空的 object 而不是空的 array。
$qarray = ['match_all' => (object)[]];
print_r(json_encode($qarray));
【讨论】:
您得到的结果是预期的,因为[] 表示 JSON 数组而不是 JSON 对象。如果您需要一个对象,则需要明确提供一个对象,例如
<?php
$qarray = Array("match_all"=>(object)Array());
print_r(json_encode($qarray));
然而,这并没有什么实际意义,因为当你给它关联数组时,Json 编码会正确地创建对象,例如
<?php
$qarray = [ "match_all"=> [ "assoc" => true ] ];
print_r(json_encode($qarray));
打印:
{"match_all":{"assoc":true}}
就 JSON 编码而言,关联数组是指任何没有序列号作为索引的数组。
另外,在我看来,短数组语法看起来更容易一些,但与使用 Array() 并没有什么不同
【讨论】:
您想要的是object 而不是array。这将生成您想要的输出。
$qarray = array("match_all" => new stdClass());
print_r(json_encode($qarray));
【讨论】:
作为其他提供的答案的插件,如果您有多个值,每次将它们全部转换为对象会很烦人,因此您可以很容易地在声明后添加一个循环以将所有值设置为对象。
$qarray=Array("match_all"=>Array());
foreach($qarray as $key => $val) {
if(!is_array($val)) continue;
$qarray[$key] = (object)$val;
}
print_r(json_encode($qarray));
这使得代码更加动态,因为无论有多少键,只要值是数组,它们的值都会在编码之前设置为对象。
【讨论】:
PHP json_encode 函数有选项标志作为第二个参数。 你可以把它设置为 JSON_FORCE_OBJECT,然后就会得到你想要的结果。
试试这个代码。
<?php
$qarray=Array("match_all"=>Array());
print_r(json_encode($qarray, JSON_FORCE_OBJECT));
?>
【讨论】:
你应该指定这是一个对象,而不是一个数组:
$qarray=Array("match_all"=>(object) Array());
print_r(json_encode($qarray));
【讨论】: