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

用PHP在JSON中创建空对象的最佳方法?,php,json,Php,Json,要创建空的JSON对象,我通常使用: json_encode((object) null); 将null强制转换为对象是可行的,但此解决方案是否有其他更好的方法和/或任何问题?好的,只需从PHP数组/对象/等返回字符串即可。通过执行以下操作,可以更有效地实现相同的效果: $json = '{}'; 使用函数来实现这一点是没有意义的 更新 根据您的评论更新,您可以尝试: $test = json_encode(array('some_properties'=>new stdClass))

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

json_encode((object) null);
将null强制转换为对象是可行的,但此解决方案是否有其他更好的方法和/或任何问题?

好的,只需从PHP数组/对象/等返回字符串即可。通过执行以下操作,可以更有效地实现相同的效果:

$json = '{}';
使用函数来实现这一点是没有意义的

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

$test = json_encode(array('some_properties'=>new stdClass));
尽管我不确定这是否比你一直在做的更好。

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

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


.. 但是,尽量保持安全! 虽然您永远不知道上述情况何时/是否会发生变化,但如果您希望100%确定编码数据中始终会出现
{}
,您可以使用如下黑客攻击:

json_encode (json_decode ("{}"));
尽管它既乏味又难看,但我确实认为/希望json_encode/json_decode与其中一个兼容,并且始终将以下内容评估为真:

$a = <something>;

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

如果您使用对象作为动态字典(我猜您是这样做的),那么我认为您需要使用一个

即使是空的,它也会映射到JSON字典中。如果需要区分列表(数组)和字典(关联数组),这将非常有用:

您还可以无缝地操作它(就像使用关联数组一样),并且它将保持在字典中正确呈现:

$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
对象(您需要遍历结果树并递归地替换所有对象,这是一项相当简单的任务)


抓住机会。到目前为止,我只找到了一个:
是_array(new ArrayObject())
的计算结果为
false
。您需要找到
is_array
实例并将其替换为
is_iterable
,以便使用我使用的PHP在JSON中创建一个空对象

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

stdClass Object
(
    [status] => 202
    [message] => Accepted
)
这是必要的,因为以后我必须这样做

if(is_object($json))
你也可以使用

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

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

$json = (Object)[]; // [] could also be array()
。。。在PHP中使用它

$json = json_encode($json);

。。。现在它是真正的JSON…

JSON\u编码($array,JSON\u FORCE\u OBJECT)
也可以。请参见

为什么要将null转换为JSON对象?还有,最终的结果不是{}吗?你可以这么做。(对象)(数组())也许?您的解决方案听起来不错。
json\u encode()
返回字符串,而不是对象。为什么要这样做?我是不是遗漏了什么?实际上,{}是以字符串的形式出现的!我确实希望得到这样的结果:{“some_property”:{},它是一个空的json对象。我将空值转换为对象,因为我现在不知道任何其他解决方案;)我喜欢你的解决方案8]不,这是一个带括号的字符串,我想实现类似:{“some_properties”:{}}。。。不是{“some_properties”:“{}”那是不同的。哦,妈的,我花了太多时间写我的文章。。8分钟太晚了,哈哈@refp哈哈,很难与百科全书式的答案相抗衡:)hehe抱歉rdlowrey,但@refp非常详尽;)这是这里最正确的答案,它完全符合这种情况下的需要谢谢,这是最好的答案,完全符合我的需要。在阅读本文之前,我的代码从
jsonResponse=array()
开始,然后由循环动态填充。如果循环没有一次迭代,“空”对象(或字典,如您所称)被编码为
[]
,而所有其他情况被编码为“{attr_1:value1,…}”
。这里的所有其他答案都有一个缺陷。他们假设你已经知道字典是否是空的。尤其是告诉你应该只写
$json={}的答案`根本不使用json编码是徒劳的。gotcha不应该应用-因为
ArrayObject
实现
iterable
,您可以同时执行
is\u iterable($foo)
以及使用
iterable
类型提示而不是
array
,您无论如何都应该这样做,以便让自己可以选择传递
ArrayAccess
的实例,例如。酷!更新了答案。使用“new ArrayObject()”或“(object)null”后,“我正在获取=>“object”而不是“{}”'作为响应。使用PHP5.6.29。谢谢……但是,请记住,此解决方案还将非索引数组转换为具有键值对的对象。例如:
json_编码(['a','b'],json_FORCE_object)
将返回
{“0”:“a”,“1”:“b”}
$json = (Object)[]; // [] could also be array()
$json = json_encode($json);