通过纯枚举实现 JsonSerializable
Implementing JsonSerializable by a Pure Enum
根据 PHP 手册
If a Pure Enum is serialized to JSON, an error will be thrown. If a Backed Enum is serialized to JSON, it will be represented by its value scalar only, in the appropriate type. The behavior of both may be overridden by implementing JsonSerializable
让我们尝试实施JsonSerializable
enum Suit implements JsonSerializable
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
public function jsonSerialize(): array {
return [1, 2, 3, 4];
}
}
echo json_encode(Suit::cases());
它打印:
[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
为什么 [1,2,3,4]
重复了 4 次?
连载时如何控制一个enum
中的每个case?
在 enum
中,每个 case 都是 enum
的对象实例。这意味着 JsonSerializable
由它们中的每一个实现。 Suit::cases()
将 return 枚举中所有情况的打包数组(a.k.a 对象),因此将对每个案例调用 jsonSerialize
方法,因此会出现重复数组。
如何在序列化过程中控制枚举中的每个案例?
我们可以简单地使用一个match
表达式
public function jsonSerialize(): string {
return match($this) {
Suit::Hearts => 'H',
Suit::Diamonds => 'D',
Suit::Clubs => 'C',
Suit::Spades => 'S'
};
}
它打印:
["H","D","C","S"]
根据 PHP 手册
If a Pure Enum is serialized to JSON, an error will be thrown. If a Backed Enum is serialized to JSON, it will be represented by its value scalar only, in the appropriate type. The behavior of both may be overridden by implementing JsonSerializable
让我们尝试实施JsonSerializable
enum Suit implements JsonSerializable
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
public function jsonSerialize(): array {
return [1, 2, 3, 4];
}
}
echo json_encode(Suit::cases());
它打印:
[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
为什么 [1,2,3,4]
重复了 4 次?
连载时如何控制一个enum
中的每个case?
在 enum
中,每个 case 都是 enum
的对象实例。这意味着 JsonSerializable
由它们中的每一个实现。 Suit::cases()
将 return 枚举中所有情况的打包数组(a.k.a 对象),因此将对每个案例调用 jsonSerialize
方法,因此会出现重复数组。
如何在序列化过程中控制枚举中的每个案例?
我们可以简单地使用一个match
表达式
public function jsonSerialize(): string {
return match($this) {
Suit::Hearts => 'H',
Suit::Diamonds => 'D',
Suit::Clubs => 'C',
Suit::Spades => 'S'
};
}
它打印:
["H","D","C","S"]