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


93

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

json_encode((object) null);

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


为什么将null转换为JSON对象?另外,最终结果不是{}吗?你可以那样做。
艾曼·萨法迪

1
(object)(array())也许是?您的解决方案听起来不错。
malletjo 2011年

1
json_encode()返回字符串,而不是对象。为什么这样 我在这里想念什么吗?
Telmo Marques

2
实际上“ {}”以字符串形式出现!我确实想要这样的结果:{“ some_property”:{}}这是一个空的json对象。我将null转换为object,因为我目前不知道任何其他解决方案;)
pna

我喜欢您的解决方案8]
安德鲁(Andrew)

Answers:


112

您的解决方案可以工作。

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

PHP:对象-手册

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


..但是,请尝试确保其安全!

虽然您永远都不知道上述内容何时/是否会更改,但是如果您想100%确定您将始终以{}编码数据结尾,则可以使用以下方法:

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
使用“ new ArrayObject()”或“(object)null”后,我得到=>“ Object”而不是'{}'作为响应。使用php 5.6.29。
rohitmb

81

如果您将对象用作动态字典(我猜您也这样做),那么我认为您想使用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_arrayis_iterable


5
这是这里最正确的答案,它确实满足了这种情况下的需要
Avi Kapuya 2014年

2
谢谢,这是最好的答案,完全符合我的需求。在阅读此内容之前,我的代码始于,jsonResponse = array()然后由循环动态填充。如果循环没有单个迭代,则将“空”对象(或字典,如您所称)进行编码,[]而将所有其他情况编码为“ {attr_1:value1,...} . All the other answers around here have a flaw. They assume that one already knows if the dictionary is empty or not in advance. Especially the answer that tells one should simply write $ json = {}`和完全不使用json_encode是徒劳的
user2690527 2015年

陷阱不适用-自从ArrayObject实现以来iterable,您既可以is_iterable($foo)使用iterable类型提示也可以使用类型提示,而array无论如何,您都应该这样做,以使自己可以选择传递实例ArrayAccess,例如。
莫里茨·弗里德里希

凉!更新了答案。
wrygiel19年

17

好吧,json_encode()只需从PHP数组/对象/等返回一个字符串。通过执行以下操作,您可以更有效地达到相同的效果:

$json = '{}';

使用函数来完成此操作实际上没有任何意义。

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

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

尽管我不确定这是否比您所做的更好。


1
不,这是一个内部带有括号的字符串,我想实现类似以下内容:{“ some_properties”:{}} ... NOT {“ some_properties”:“ {}”}这是不同的。
pna

哦,该死,花了太多时间写我的帖子。。8分钟来不及了哈哈!
FilipRoséen-refp

@refp Haha很难与百科全书答案竞争:)
rdlowrey

嘿对不起rdlowrey但@refp非常详尽;)
pna

9

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

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

产生了

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

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

if(is_object($json))

5

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

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

...在PHP中试玩一下...

$json = json_encode($json);

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.