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

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

json_encode((object) null); 

将null赋值给一个对象是有效的,但是这个解决scheme有没有其他可取的方法和/或任何问题?

你的解决scheme可以工作

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

PHP:对象 – 手册

如果任何其他types的值被转换为对象,则会创build一个stdClass内置类的新实例。 如果该值为NULL,则新实例将为空。


..但是,尽量保持安全!

虽然你永远不知道上述情况将会发生什么变化,所以如果你想100%确定你的编码数据中总是会有一个{} ,你可以使用下面的方法:

 json_encode (json_decode ("{}")); 

即使它是单调乏味的,我假设/希望json_encode / json_decode是兼容的和其他人,总是会评估以下为真:

 $a = <something>; $a === json_decode (json_encode ($a)); 

build议的方法

json_decode ("{}")会默认返回一个stdClass ,使用下面的应该被认为是安全的。 虽然如前所述,它和(object) null几乎是一样的。

 json_encode (new stdClass); 

如果你使用对象作为dynamic字典(我猜你会这样做),那么我想你想使用一个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对象(你需要遍历结果树并recursion地replace所有的对象,这是一个相当简单的任务) 。

哎呀 。 只有一个我发现到目前为止: is_array(new ArrayObject())计算结果为false 。 您可能需要在代码中查找并replaceis_array (使用(($foo instanceof ArrayObject) || is_array($foo)) )。

那么, json_encode()只是从PHP数组/对象/ etc返回一个string。 您可以通过以下方法更有效地达到相同的效果:

 $json = '{}'; 

使用一个函数来完成这件事实在没有意义。

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

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

虽然我不确定这比你所做的更好。

在PHP中使用JSON创build一个空对象

 $json=json_decode('{}'); $json->status=202; $json->message='Accepted'; print_r($json); 

其中产生

 stdClass Object ( [status] => 202 [message] => Accepted ) 

这是必要的,因为以后我必须这样做

 if(is_object($json))