为了创建一个空的 JSON 对象,我通常使用:
json_encode((object) null);
将 null 转换为对象可以工作,但是这个解决方案是否有其他更好的方法和/或任何问题?
json_encode()只是从 PHP 数组/对象/等返回一个字符串。你可以通过以下方法更有效地达到同样的效果:
json_encode()
$json = '{}';
使用函数来实现这一点真的没有意义。
更新 根据你的评论更新,你可以尝试:
$test = json_encode(array('some_properties'=>new stdClass));
虽然我不确定这比你现在做的好不好。
json_decode ("{}")将返回一个 stdClass每缺省,使用以下应被认为是安全/便携式和正确的。
json_decode ("{}")
stdClass
json_encode (new stdClass);
文档指定 (object) null将导致一个空对象,因此有些人可能会说您的代码是有效的,并且它是要使用的方法。
(object) null
PHP: Objects-Manual 如果将任何其他类型的值转换为对象,则创建 stdClass 内置类的新实例。如果值为 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对象(你需要遍历结果树并递归地替换所有对象,这是一个相当容易的任务)。
json_decode
ArrayObjects
抓到你了。到目前为止,我只找到了一个: is_array(new ArrayObject())的计算结果为 false。您需要找到并用 is_iterable替换 is_array出现。
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
json_encode($array, JSON_FORCE_OBJECT)