用 PHP 在 JSON 创建空对象的最佳方法是什么?

为了创建一个空的 JSON 对象,我通常使用:

json_encode((object) null);

将 null 转换为对象可以工作,但是这个解决方案是否有其他更好的方法和/或任何问题?

97836 次浏览

json_encode()只是从 PHP 数组/对象/等返回一个字符串。你可以通过以下方法更有效地达到同样的效果:

$json = '{}';

使用函数来实现这一点真的没有意义。

更新 根据你的评论更新,你可以尝试:

$test = json_encode(array('some_properties'=>new stdClass));

虽然我不确定这比你现在做的好不好。

推荐方法

json_decode ("{}")将返回一个 stdClass每缺省,使用以下应被认为是安全/便携式和正确的。

json_encode (new stdClass);


你的解决办法可以奏效。

文档指定 (object) null将导致一个空对象,因此有些人可能会说您的代码是有效的,并且它是要使用的方法。

PHP: Objects-Manual

如果将任何其他类型的值转换为对象,则创建 stdClass 内置类的新实例。如果值为 NULL,则新实例将为空。

. . 但是,尽量保证它的安全!

虽然你永远不知道什么时候/如果上述情况会改变,所以如果你想100% 确定你的编码数据最终总会有一个 {},你可以使用如下黑客技术:

$empty = json_decode ("{}");
$result = json_encode($empty); // "{}"

尽管它冗长而丑陋,我还是假设/希望 json _ encode/json _ decode 是相互兼容的,并且总是将以下内容计算为真:

$a = <something>;


$a === json_decode (json_encode ($a));

如果您使用对象作为动态字典(我猜您是这样做的) ,那么我认为您需要使用 数组对象

It maps into JSON dictionary even when it's empty. It is great if you need to distinguish between lists (arrays) and dictionaries (associative arrays):

$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}

你也可以无缝地操作它(就像使用关联数组一样) ,它会一直正确地呈现在字典中:

$complex['dict']['a'] = 123;
print json_encode($complex); // -> {"list":[],"dict":{"a":123}}


unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}

如果你需要100% 兼容 都有的方式 ,你也可以包装 json_decode,使它返回 ArrayObjects而不是 stdClass对象(你需要遍历结果树并递归地替换所有对象,这是一个相当容易的任务)。

抓到你了。到目前为止,我只找到了一个: is_array(new ArrayObject())的计算结果为 false。您需要找到并用 is_iterable替换 is_array出现。

json_encode($array, JSON_FORCE_OBJECT) will do it too. see https://www.php.net/manual/en/function.json-encode.php