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

pna*_*pna 83 php json

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

json_encode((object) null);
Run Code Online (Sandbox Code Playgroud)

将null转换为对象可以工作,但是这个解决方案还有其他更好的方法和/或任何问题吗?

Fil*_*efp 102

你的解决方案可行..

文档指定(object) null将导致一个空对象,有些可能因此说你的代码是有效的,并且它是使用的方法.

PHP:对象 - 手动

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


..但是,尽量保持安全!

虽然您永远不知道上述内容何时会发生变化,但如果您希望100%确定您将始终以{}编码数据结尾,则可以使用以下方法:

json_encode (json_decode ("{}"));
Run Code Online (Sandbox Code Playgroud)

即使它很乏味和丑陋,我也会假设/希望json_encode/json_decode与其中一个兼容,并始终将以下内容评估为true:

$a = <something>;

$a === json_decode (json_encode ($a)); 
Run Code Online (Sandbox Code Playgroud)

推荐方法

json_decode ("{}")将返回stdClass默认值,如果认为安全,则使用以下内容.虽然如上所述,它与做的几乎完全相同(object) null.

json_encode (new stdClass);
Run Code Online (Sandbox Code Playgroud)


wry*_*iel 73

如果你使用对象作为动态词典(我猜你这样做),那么我认为你想使用一个ArrayObject.

它映射到JSON字典,即使它是空的.如果你需要区分列表(数组)和字典(关联数组),那就太棒了:

$complex = array('list' => array(), 'dict' => new ArrayObject());
print json_encode($complex); // -> {"list":[],"dict":{}}
Run Code Online (Sandbox Code Playgroud)

您也可以无缝地操作它(就像使用关联数组一样),它将继续正确地渲染到字典中:

$complex['dict']['a'] = 123;
print json_encode($complex); // -> {"list":[],"dict":{"a":123}}

unset($complex['dict']['a']);
print json_encode($complex); // -> {"list":[],"dict":{}}
Run Code Online (Sandbox Code Playgroud)

如果你需要这两种方式100%兼容,你也可以包装json_decode,使它返回ArrayObjects而不是stdClass对象(你需要遍历结果树并递归替换所有对象,这是一个相当容易的任务).

陷阱.到目前为止我找到的只有一个:is_array(new ArrayObject())评估为false.您可能需要is_array在代码中查找和替换出现的内容(使用is_iterable).

  • 这是这里最正确的答案,它确实完全符合这种情况 (5认同)
  • 谢谢,这是最好的答案,完全符合我的需求.在阅读本文之前,我的代码以`jsonResponse = array()`开头,然后由循环动态填充.如果循环没有单个迭代,则"空"对象(或字典,如您所说)编码为"[]",而所有其他情况编码为"{attr_1:value1,...}".这里的其他答案有一个缺陷.他们假设一个人已经知道字典是否是空的.特别是答案告诉一个人应该只写`$ json = {}`并且根本不使用json_encode是徒劳的. (2认同)

rdl*_*rey 17

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

$json = '{}';
Run Code Online (Sandbox Code Playgroud)

使用函数来实现这一点真的没有意义.

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

$test = json_encode(array('some_properties'=>new stdClass));
Run Code Online (Sandbox Code Playgroud)

虽然我不确定那比你做的更好.


sno*_*6oy 8

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

$json=json_decode('{}');
$json->status=202;
$json->message='Accepted';
print_r($json);
Run Code Online (Sandbox Code Playgroud)

哪个产生了

stdClass Object
(
    [status] => 202
    [message] => Accepted
)
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为后来我必须这样做

if(is_object($json))
Run Code Online (Sandbox Code Playgroud)


Anu*_*uga 6

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

$json = (Object)[]; // [] could also be array()
Run Code Online (Sandbox Code Playgroud)

... 在 PHP 中玩转它 ...

$json = json_encode($json);
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*otz 6

json_encode($array, JSON_FORCE_OBJECT)也会这么做。请参阅https://www.php.net/manual/en/function.json-encode.php