使用 PHP 在 JSON 中创建空对象的最佳方法?

新手上路,请多包涵

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

 json_encode((object) null);

将 null 强制转换为对象是可行的,但是这个解决方案还有其他更好的方法和/或任何问题吗?

原文由 pna 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

如果您将对象用作动态字典(我猜您会这样做),那么我认为您想使用 ArrayObject

即使它是空的,它也会映射到 JSON 字典。 如果您需要区分列表(数组)和字典(关联数组),那就太好了:

 $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_array 查找并替换出现的 is_iterable

原文由 wrygiel 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐方法

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

 json_encode (new stdClass);



你的解决方案可以工作..

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

PHP:对象 - 手册

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

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

尽管您永远不知道上述内容何时/是否会改变,但如果您想 100% 确定您将始终在编码数据中得到 {} 您可以使用诸如:

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

尽管它既乏味又丑陋,但我确实假设/希望 json_encode/json_decode 彼此兼容,并且总是将以下评估为真:

 $a = <something>;

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

原文由 Filip Roséen - refp 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题