使用 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 中创建空对象的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 在 NFS 共享目录中创建空会话

怎样在MATLAB中创建空的N维数组?

cd是啥意思。 > 在 Windows CMD 中创建空文件?

Nhibernate Fluent 日期时间映射在 DB 中创建空列

使用 或 new Object() 在 JavaScript 中创建一个空对象?

r 在R中创建空数据框