PHP 日本大会 2024

JsonSerializable::jsonSerialize

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

JsonSerializable::jsonSerialize指定应序列化为 JSON 的数据

描述

public JsonSerializable::jsonSerialize(): 混合类型

将对象序列化为 json_encode() 可以原生序列化的值。

参数

此函数没有参数。

返回值

返回可以被 json_encode() 序列化的数据,其值为除 资源 之外的任何类型。

范例

示例 #1 JsonSerializable::jsonSerialize() 示例返回一个 数组

<?php
ArrayValue 实现 JsonSerializable {
私有
$array;
公共函数
__construct(数组 $array) {
$this->array = $array;
}

公共函数
jsonSerialize(): 混合类型 {
返回
$this->array;
}
}

$array = [1, 2, 3];
echo
json_encode(new ArrayValue($array), JSON_PRETTY_PRINT);
?>

以上示例将输出

[
    1,
    2,
    3
]

示例 #2 JsonSerializable::jsonSerialize() 示例返回一个关联 数组

<?php
ArrayValue 实现 JsonSerializable {
私有
$array;
公共函数
__construct(数组 $array) {
$this->array = $array;
}

公共函数
jsonSerialize() {
返回
$this->array;
}
}

$array = ['foo' => 'bar', 'quux' => 'baz'];
echo
json_encode(new ArrayValue($array), JSON_PRETTY_PRINT);
?>

以上示例将输出

{
    "foo": "bar",
    "quux": "baz"
}

示例 #3 JsonSerializable::jsonSerialize() 示例返回一个 整数

<?php
IntegerValue 实现 JsonSerializable {
私有
$number;
公共函数
__construct($number) {
$this->number = (int) $number;
}

公共函数
jsonSerialize() {
返回
$this->number;
}
}

echo
json_encode(new IntegerValue(1), JSON_PRETTY_PRINT);
?>

以上示例将输出

1

示例 #4 JsonSerializable::jsonSerialize() 示例返回一个 字符串

<?php
StringValue 实现 JsonSerializable {
私有
$string;
公共函数
__construct($string) {
$this->string = (string) $string;
}

公共函数
jsonSerialize() {
返回
$this->string;
}
}

echo
json_encode(new StringValue('Hello!'), JSON_PRETTY_PRINT);
?>

以上示例将输出

"Hello!"

添加注释

用户贡献注释 4 条注释

78
benkuhl at gmail dot com
11 年前
使用此类功能的一个很好的例子是在处理对象时。

json_encode() 将获取 DateTime 并将其转换为

{
"date":"2013-01-31 11:14:05",
"timezone_type":3,
"timezone":"America\/Los_Angeles"
}

在使用 PHP 时这很好,但是如果日期由 Java 读取。Java 日期解析器不知道如何处理它。但它确实知道如何处理 ISO8601 格式……

<?php

date_default_timezone_set
('America/Los_Angeles');

class
Fruit implements JsonSerializable {
public
$type = 'Apple',
$lastEaten = null;

public function
__construct() {
$this->lastEaten = new DateTime();
}

public function
jsonSerialize() {
return [
'type' => $this->type,
'lastEaten' => $this->lastEaten->format(DateTime::ISO8601)
];
}
}
echo
json_encode(new Fruit()); //输出结果:{"type":"Apple","lastEaten":"2013-01-31T11:17:07-0500"}

?>
17
tomasz dot darmetko at gmail dot com
7年前
嵌套的 Json 可序列化对象将递归序列化。无需自行调用 ->jsonSerialize()。这在集合中特别有用。

<?php

class NestedSerializable implements \JsonSerializable
{

private
$serializable;

public function
__construct($serializable)
{
$this->serializable = $serializable;
}

public function
jsonSerialize()
{
return [
'serialized' => $this->serializable
];
}

}

class
SerializableCollection implements \JsonSerializable {

private
$elements;

public function
__construct(array $elements)
{
$this->elements = $elements;
}

public function
jsonSerialize()
{
return
$this->elements;
}

}

// 输出结果:[{"serialized":null},{"serialized":null},{"serialized":{"serialized":null}}]
echo json_encode(
new
SerializableCollection([
new
NestedSerializable(null),
new
NestedSerializable(null),
new
NestedSerializable(new NestedSerializable(null))
])
);

?>
5
info at digistratum dot com
7年前
这是一个小的测试/证明,可以很容易地看到一些比较结果。由于空值没有在文档中说明,所以我对此很感兴趣。

<?php
class jsontest implements JsonSerializable {
function
__construct($value) { $this->value = $value; }
function
jsonSerialize() { return $this->value; }
}

print
"Null -> " . json_encode(new jsontest(null)) . "\n";
print
"Array -> " . json_encode(new jsontest(Array(1,2,3))) . "\n";
print
"Assoc. -> " . json_encode(new jsontest(Array('a'=>1,'b'=>3,'c'=>4))) . "\n";
print
"Int -> " . json_encode(new jsontest(5)) . "\n";
print
"String -> " . json_encode(new jsontest('Hello, World!')) . "\n";
print
"Object -> " . json_encode(new jsontest((object) Array('a'=>1,'b'=>3,'c'=>4))) . "\n";
?>

输出结果
Null -> null
Array -> [1,2,3]
Assoc. -> {"a":1,"b":3,"c":4}
Int -> 5
String -> "Hello, World!"
Object -> {"a":1,"b":3,"c":4}
1
david at vanlaatum dot id dot au
9年前
simonsimcity at gmail dot com 的说法是错误的,你可以在其中抛出异常,但它会用另一个异常包装起来,因此他的例子输出

PHP致命错误:捕获到的异常“RuntimeException”,消息为“It failed!”在 -:8
堆栈跟踪
#0 [内部函数]:Foo->jsonSerialize()
#1 -(16):json_encode(Object(Foo))
#2 {main}

下一个异常“Exception”,消息为“Failed calling Foo::jsonSerialize()”在 -:16
堆栈跟踪
#0 -(0):json_encode()
#2 {main}
在 - 的第 16 行抛出

PHP 5.4.39
To Top