luverelle / pson
PHP 库,用于将数据转换为 JSON 格式以及相反操作
v1.1.0
2022-07-24 20:42 UTC
Requires
- php: ^8.0
- ext-json: *
Requires (Dev)
- jetbrains/phpstorm-attributes: ^1.0
- phpstan/phpstan: ^1.7
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-25 01:07:05 UTC
README
一个强大的 PHP 库,使用 PHP 属性将对象转换为 JSON 格式以及相反操作
功能
- 易于使用
- 可扩展
- 高性能
- 完全定制化
入门
属性
PSON 获取所有对象属性(包括存在的父级属性),如果某些属性具有 JsonProperty 属性,它们将被转换为 JSON。
<?php class User{ private int $id = 1; //won't be converted into JSON #[JsonProperty("name")] private string $name = "Daniel"; //will be converted into JSON like {"name": "Daniel"} }
将对象转换为 JSON
- 创建一个
object实例 - 调用
PSON::toJsonArray(object)方法 - 使用您的标志调用
json_encode
示例 - 将 User 对象转换为 JSON
<?php declare(strict_types=1); use luverelle\pson\attributes\JsonProperty; use luverelle\pson\PSON; class User{ #[JsonProperty("name")] private string $name; #[JsonProperty("email")] private string $email; #[JsonProperty("rating")] private float $socialRating; public function __construct(string $name, string $email, float $socialRating){ $this->name = $name; $this->email = $email; $this->socialRating = $socialRating; } } $user = new User("Jiang Xina", "china@gmail.cn", 999.99); $jsonArray = PSON::toJsonArray($user); echo json_encode($jsonArray, JSON_PRETTY_PRINT);
结果将是
{
"name": "Jiang Xina",
"email": "china@gmail.cn",
"rating": 999.99
}
将 JSON 转换为对象:
- 使用
associative: true调用json_decode - 如果您已经实例化了对像,请使用
PSON::fromJsonArray。它返回空,因为 PHP 默认通过引用传递所有对像 - 否则,使用
PSON::fromJsonArrayAsClass,提供您希望获取(返回)的该对像的类名。
示例 - 将 JSON 转换为 User(前例的反操作)
<?php declare(strict_types=1); use luverelle\pson\attributes\JsonProperty; use luverelle\pson\PSON; class User{ #[JsonProperty("name")] private string $name; #[JsonProperty("email")] private string $email; #[JsonProperty("rating")] private float $socialRating; public function __construct(string $name, string $email, float $socialRating){ $this->name = $name; $this->email = $email; $this->socialRating = $socialRating; } } $json = '{ "name": "Jiang Xina", "email": "china@gmail.cn", "rating": 999.99 }'; $user = PSON::fromJsonArrayAsClass(json_decode($json, true), User::class); var_dump($user);
结果将是
object(User)#2 (3) { ["name":"User":private]=> string(10) "Jiang Xina" ["email":"User":private]=> string(14) "china@gmail.cn" ["socialRating":"User":private]=> float(999.99) }
嵌套对像
如果您有一个包含其他对像属性的对象,并且您想将所有这些一起转换为 JSON,只需添加 JsonProperty 属性即可。具有该属性的属性将被转换为 JSON。它也适用于相反操作:JSON -> 对像。示例
<?php declare(strict_types=1); use luverelle\pson\attributes\JsonProperty; use luverelle\pson\PSON; class Address{ #[JsonProperty("post_code")] private int $postCode; #[JsonProperty("city")] private string $city; public function __construct(int $postCode, string $city){ $this->postCode = $postCode; $this->city = $city; } } class Contact{ #[JsonProperty("name")] private string $name; #[JsonProperty("address")] private Address $address; public function __construct(string $name, Address $address){ $this->name = $name; $this->address = $address; } } $contact = new Contact("Elizabeth", new Address(350000, "Krasnodar")); $jsonArray = PSON::toJsonArray($contact); echo json_encode($jsonArray, JSON_PRETTY_PRINT) . PHP_EOL; var_dump(PSON::fromJsonArrayAsClass($jsonArray, Contact::class));
结果将是
{
"name": "Elizabeth",
"address": {
"post_code": 350000,
"city": "Krasnodar"
}
}
object(Contact)#8 (2) {
["name":"Contact":private]=>
string(9) "Elizabeth"
["address":"Contact":private]=>
object(Address)#15 (2) {
["postCode":"Address":private]=>
int(350000)
["city":"Address":private]=>
string(9) "Krasnodar"
}
}
对象数组
如果您想添加一个可转换为 JSON 的对象数组(如 User[]),请确保在 JsonProperty 属性中添加您希望转换的对象类型
<?php class User{ //some stuff } class UserManager{ /** * @var User[] */ #[JsonProperty("users", arrayValueClass: User::class)] private array $cachedUsers; //note that phpdoc isn't necessary for json, it's for type hinting in IDE }
待办事项列表
- 添加 更多 测试
- 添加 更多 可定制 功能
要求
- PHP 8.0 或更高版本
- JSON PHP 扩展