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

时间:2011-12-21 20:05:01

标签: php json

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

json_encode((object) null);

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

7 个答案:

答案 0 :(得分:94)

您的解决方案可行..

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

  

PHP: Objects - Manual

     

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


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

虽然您永远不知道上述时间是否会发生变化,但如果您想100%确定您的编码数据中始终会有{},那么您可以使用hack等为:

json_encode (json_decode ("{}"));

即使它很乏味也很丑陋我会假设/希望json_encode / json_decode与其他人兼容,并始终将以下内容评估为真:

$a = <something>;

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

推荐方法

json_decode ("{}")每次默认会返回stdClass,因此如果认为安全,则使用以下内容。虽然如上所述,它与执行(object) null几乎完全相同。

json_encode (new stdClass);

答案 1 :(得分:68)

如果你使用对象作为动态词典(我猜你这样做),那么我认为你想使用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而不是{ {1}}对象(你需要遍历结果树并递归替换所有对象,这是一项相当容易的任务)。

<强>陷阱即可。到目前为止我只找到了一个:stdClass评估为is_array(new ArrayObject())。您可能需要在代码中查找并替换false次出现(使用is_array)。

答案 2 :(得分:17)

好吧,json_encode()只是从PHP数组/对象/ etc返回一个字符串。您可以通过以下方式更有效地实现相同的效果:

$json = '{}';

使用函数实现这一目标毫无意义。

<强>更新 根据您的评论更新,您可以尝试:

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

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

答案 3 :(得分:7)

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

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

产生了

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

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

if(is_object($json))

答案 4 :(得分:3)

我总是做(Object)[];,例如:

$json = (Object)[]; // [] could also be array()

...在PHP中试用它...

$json = json_encode($json);

...现在是真正的JSON ...

答案 5 :(得分:2)

json_encode($array, JSON_FORCE_OBJECT)也会这样做。参见https://www.php.net/manual/en/function.json-encode.php

答案 6 :(得分:1)

您也可以使用

$var = ["key" => (object) array()];

json_encode($var);