使用 PHP 在 JSON 中创建空对象的最佳方法?
Posted
技术标签:
【中文标题】使用 PHP 在 JSON 中创建空对象的最佳方法?【英文标题】:Best way to create an empty object in JSON with PHP? 【发布时间】:2012-01-25 14:35:06 【问题描述】:要创建一个空的 JSON 对象,我通常会使用:
json_encode((object) null);
将 null 转换为对象是可行的,但是此解决方案还有其他更好的方法和/或任何问题吗?
【问题讨论】:
为什么要将 null 转换为 JSON 对象?另外,最终结果不是 吗?你可以这样做。 (object)(array()) 也许?您的解决方案听起来不错。json_encode()
返回一个字符串,而不是一个对象。为什么要这样做?我在这里错过了什么吗?
其实“”是一个字符串!我确实想要一个类似的结果: "some_property": 是一个空的 json 对象。我将 null 转换为对象,因为我现在不知道任何其他解决方案;)
我喜欢你的解决方案 8]
【参考方案1】:
您的解决方案可以工作..
文档指定(object) null
将产生一个空对象,因此有些人可能会说您的代码是有效的并且它是要使用的方法。
PHP: Objects - Manual
如果将任何其他类型的值转换为对象,则会创建 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);
【讨论】:
在使用“new ArrayObject()”或“(object) null”后,我得到 =>“Object”而不是“”作为响应。使用 php 5.6.29。【参考方案2】:json_encode($array, JSON_FORCE_OBJECT)
也会这样做。见https://www.php.net/manual/en/function.json-encode.php
【讨论】:
谢谢...但是,请记住,此解决方案还将非索引数组转换为具有键值对的对象。例如:json_encode(['a', 'b'], JSON_FORCE_OBJECT)
将返回 "0": "a", "1": "b"
【参考方案3】:
如果您将对象用作动态字典(我猜您会这样做),那么我认为您想使用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_array
并将其替换为 is_iterable
。
【讨论】:
这是最正确的答案,它完全符合这种情况的需要 谢谢,这是最好的答案,完全符合我的需要。在阅读本文之前,我的代码以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 是徒劳的。
这个问题不应该适用 - 因为ArrayObject
实现了iterable
,你可以同时使用is_iterable($foo)
以及使用iterable
类型提示而不是array
,你应该这样做无论如何,让自己选择传递ArrayAccess
的实例,例如。
酷!更新了答案。【参考方案4】:
我总是(Object)[];
,比如:
$json = (Object)[]; // [] could also be array()
...在 PHP 中使用它...
$json = json_encode($json);
...现在是真正的 JSON ...
【讨论】:
【参考方案5】:你也可以使用
$var = ["key" => (object) array()];
json_encode($var);
【讨论】:
【参考方案6】:我使用 PHP 在 JSON 中创建一个空对象
$json=json_decode('');
$json->status=202;
$json->message='Accepted';
print_r($json);
生产的
stdClass Object
(
[status] => 202
[message] => Accepted
)
这是必要的,因为以后我必须这样做
if(is_object($json))
【讨论】:
【参考方案7】:好吧,json_encode()
只是从 PHP 数组/对象/等返回一个字符串。您可以通过以下方式更有效地实现相同的效果:
$json = '';
使用函数来实现这一点确实没有意义。
更新 根据您的评论更新,您可以尝试:
$test = json_encode(array('some_properties'=>new stdClass));
虽然我不确定这是否比你一直在做的更好。
【讨论】:
不,这是一个带有括号的字符串,我想实现类似: "some_properties": ... NOT "some_properties": "" 即不同。 天哪,我的帖子写的太费时间了……晚了8分钟哈哈! @refp 哈哈很难与百科全书的答案竞争:) 嘿嘿抱歉 rdlowrey 但@refp 非常详尽;)以上是关于使用 PHP 在 JSON 中创建空对象的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章
cd是啥意思。 > 在 Windows CMD 中创建空文件?
Nhibernate Fluent 日期时间映射在 DB 中创建空列