根据PHP手册
如果将 Pure Enum 序列化为 JSON,则会抛出错误。如果将支持的枚举序列化为 JSON,则它将仅由其值标量以适当的类型表示。两者的行为都可以通过实现 JsonSerialized 来覆盖
让我们尝试实现一下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());
Run Code Online (Sandbox Code Playgroud)
它打印:
[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
Run Code Online (Sandbox Code Playgroud)
为什么[1,2,3,4]
重复4次?
如何控制enum
序列化过程中的每个案例?
在enum
每种情况下都是 that 的一个对象实例enum
。这意味着JsonSerializable
由他们每个人实施。Suit::cases()
将返回枚举(也称为对象)中所有情况的打包数组,因此jsonSerialize
将在其中的每一个上调用方法,从而产生重复的数组。
如何在序列化期间控制枚举中的每个案例?
我们可以简单地使用一个match
表达式
public function jsonSerialize(): string {
return match($this) {
Suit::Hearts => 'H',
Suit::Diamonds => 'D',
Suit::Clubs => 'C',
Suit::Spades => 'S'
};
}
Run Code Online (Sandbox Code Playgroud)
它打印:
["H","D","C","S"]
Run Code Online (Sandbox Code Playgroud)