要创建一个空的JSON对象,我通常会使用:
json_encode((object) null);
将null转换为对象是有效的,但是这个解决方案还有其他更好的方法和/或任何问题吗?
答案 0 :(得分:94)
文档指定(object) null
将导致一个空对象,有些可能因此说你的代码是有效的,并且它是使用的方法。
如果将任何其他类型的值转换为对象,则会创建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);