eden-tech-labs/json-2-php-class

从 JSON 字符串或对象创建本地类对象

1.0.3 2021-04-12 12:41 UTC

This package is auto-updated.

Last update: 2024-09-12 20:32:02 UTC


README

从 JSON 字符串或对象创建本地类对象 json-2-php-class 是一个将 JSON 对象转换为本地类的库。

需求

  • PHP 7.2 及以上版本。(应进行检查!)

安装

1. 使用 Composer

您可以通过 Composer 安装此库。如果您还没有安装 Composer,请首先从 这里 安装它。

安装 composer 后,然后运行以下命令安装 json-2-php-class 库

composer require eden-tech-labs/json-2-php-class

2. 手动

警告:您必须 require 使用过的类或创建一个自动加载函数来执行此操作。
如果您不使用 Composer,您也可以将 eden-tech-labs/json-2-php-class 仓库克隆到您项目目录中的一个目录

git clone https://github.com/eden-tech-labs/json-2-php-class

但是,推荐使用 Composer,因为您可以轻松地保持库更新并处理自动加载。

使用方法

安装 json-2-php-class 库后,在您的类中,您应该实现 interface 并使用符合 interface 要求的 trait。之后,您应该重写 _mapping() 方法。您可以在下面的实现和文档中进行检查。您可以在类中或在 PHPDoc 中定义您的属性,如示例所示。定义了属性规则后,您可以导出 PHPDoc。以下是一个示例。(待添加链接)

示例类

use DateTime;
use EdenTechLabs\JSON2PHPClass\MadeFromDataContract;
use EdenTechLabs\JSON2PHPClass\MadeFromJson;
use EdenTechLabs\Common\Enum;

/**
 * Class MyApp\SampleClass
 * @property string applicationId
 * @property SampleKind kind
 * @property DateTime purchaseTime
 * @property object developerPayload
 * @property int quantity
 * @property bool acknowledged
 * @property SamplePayload samplePayload
 */
class SampleClass implements MadeFromDataContract
{
    use MadeFromJson;

    protected static function _mapping(): array
    {
        return [
            'applicationId' => 'string',
            'kind' => SampleKind::class,
            'purchaseTime' => 'milliseconds',
            'developerPayload' => 'json',
            'quantity' => 'int',
            'acknowledged' => 'bool',
            'samplePayload' => SamplePayload::class,
        ];
    }
}

/**
 * Class MyApp\SamplePayload
 * @property string stupidId
 * @property bool autoRenewing
 * @property \DateTime purchaseTime
 */
class SamplePayload implements MadeFromDataContract
{
    use MadeFromJson;

    protected static function _mapping() : array {
        return [
            'stupidId' => 'string',
            'autoRenewing' => 'bool',
            'purchaseTime' => 'seconds'
        ];
    }

}

class SampleKind extends Enum
{
    const KIND_ZERO = '0';
    const KIND_ONE = '1';
    const KIND_TWO = '2';
    const KIND_TREE = '3';
}

示例使用

$json = '
{
  "applicationId": "app-id-1",
  "kind": 2,
  "purchaseTime": "1584805754123",
  "developerPayload": "{\"foo\":\"bar\"}",
  "quantity": 34,
  "acknowledged": true,
  "samplePayload": {
    "stupidId": "foo-bar-45",
    "autoRenewing": false,
    "purchaseTime": 1584805754
  }
}
';

$myClass = SampleClass::make($json);
var_dump($myClass);

输出

object(SampleClass)#1 (7) {
  ["applicationId"]=>
  string(8) "app-id-1"
  ["kind"]=>
  object(SampleKind)#3 (1) {
    ["value":protected]=>
    int(2)
  }
  ["purchaseTime"]=>
  object(DateTime)#4 (3) {
    ["date"]=>
    string(26) "2020-03-21 15:49:14.000000"
    ["timezone_type"]=>
    int(1)
    ["timezone"]=>
    string(6) "+00:00"
  }
  ["developerPayload"]=>
  object(stdClass)#5 (1) {
    ["foo"]=>
    string(3) "bar"
  }
  ["quantity"]=>
  int(34)
  ["acknowledged"]=>
  bool(true)
  ["samplePayload"]=>
  object(SamplePayload)#6 (3) {
    ["stupidId"]=>
    string(10) "foo-bar-45"
    ["autoRenewing"]=>
    bool(false)
    ["purchaseTime"]=>
    object(DateTime)#7 (3) {
      ["date"]=>
      string(26) "2020-03-21 15:49:14.000000"
      ["timezone_type"]=>
      int(1)
      ["timezone"]=>
      string(6) "+00:00"
    }
  }
}

作为 mapping 属性,您可以定义以下类型

  • int 整数
  • string 字符串
  • float 有小数部分的任何数字
  • bool 布尔值
  • milliseconds 由字符串或包含以毫秒为单位的戳记的整数生成的 PHP DateTime 对象
  • seconds 由字符串或包含以秒为单位的戳记的整数生成的 PHP DateTime 对象
  • json 通过 json_decode 生成的标准 PHP 对象
  • unknown 值被分配给属性,而不进行任何转换。
  • AnyClass::class
    • 如果实现 implements MadeFromDataContract,则使用 make 函数创建对象
    • 其他任何类将通过 __construct 创建,传递的 value 作为第一个和唯一的参数。
  • Closure 待定义。

PHPDoc

示例

echo SampleClass::generatePHPDoc();

输出

/**
 * Class SampleClass
 * @property string applicationId
 * @property \SampleKind kind
 * @property \DateTime purchaseTime
 * @property object developerPayload
 * @property int quantity
 * @property bool acknowledged
 * @property \SamplePayload samplePayload
 */