PHP 库,用于将数据转换为 JSON 格式以及相反操作

v1.1.0 2022-07-24 20:42 UTC

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

  1. 创建一个 object 实例
  2. 调用 PSON::toJsonArray(object) 方法
  3. 使用您的标志调用 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 转换为对象:

  1. 使用 associative: true 调用 json_decode
  2. 如果您已经实例化了对像,请使用 PSON::fromJsonArray。它返回空,因为 PHP 默认通过引用传递所有对像
  3. 否则,使用 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 扩展