100% ローカル — データがブラウザの外に出ることはありません

JSONをPHPに変換|コンストラクタで昇格したクラスにする

JSONのサンプルを、コンストラクタで昇格したプロパティを持つPHP 8のクラスに変換します。名前を変えたプロパティには、元のキーが注釈としてすぐ隣に残ります。

高速 プライベート Cookieゼロ

JSON 入力

PHP 出力

このツールの動作

JSON の標本が、構築子でプロパティを昇格させた PHP のクラスになります。

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
<?php

declare(strict_types=1);

class Root
{
    public function __construct(
        public int $id,
        public string $firstName,
        public Address $address,
    ) {
    }
}

プロパティの昇格には PHP 8.0 が、readonly の設定には 8.1 が要ります。declare(strict_types=1) はわざと置いています。これが無ければ、PHP は文字列を黙って int の引数に変換し、型を書いた意味そのものが失われます。

名前を変えた項目は、鍵を保つ

ここでのプロパティ名は camelCase です。ハイフンを含む鍵や数字で始まる鍵は、名前としては生き残りません。そのとき、鍵が隣に書かれます。

        /** JSON key: "content-type" */
        public string $contentType,
        public int $fooBar,
        /** JSON key: "foo-bar" */
        public int $fooBar2,

最後の二つがその理由です。fooBar と foo-bar はどちらも $fooBar を求めるので、二つ目は $fooBar2 になります。注釈が無ければ、どちらがどの鍵から来たのかを述べるものが、ファイルのどこにもありませんでした。PHP にそれを担う標準の属性は無いので、注釈が担います。名前が鍵を保てなくなった場所にだけ付きます。

これは本当の欠落でした。この文章を書く過程で見つけました。ここに並ぶ生成器のうち、鍵を完全に失っていたのは PHP だけです。Go にはタグが、Java と C# には注釈が、Swift には CodingKeys が、Dart には fromJson があります。

PHP が狭められないもの

  • どの並びも array。 この言語に総称型は無く、list<string> は PHPStan か Psalm の docblock に住みます。どちらをお使いかは、標本には知りようがありません。
  • null と型の分からない値は mixed。 正直な型です。何でも受け取り、declare(strict_types=1) もそこでは助けになりません。項目の型が分かった時点で狭めてください。
  • 根が数値や文字列なら拒みます。 PHP に型別名は無く、42 や "テキスト" がなるべきものがありません。

標本が言えないこと

null を許すプロパティはなく、既定値を持つものもありません。文書がそれぞれに値を持っていたからです。二つ目の荷が「その鍵は無いこともある」と示したら、?string と = null に手を入れてください。そして、これらのオブジェクトが読むためのもので、埋めるためのものでないなら、readonly を入れる値打ちがあります。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

なぜ JSON の鍵が属性ではなく注釈にあるのですか。
PHP には標準の対応づけ属性が無いからです。Symfony は `#[SerializedName]` を、JMS は自前のものを求め、素の `json_decode` は何も求めません。どれかを出せば、あなたの代わりに枠組みを選ぶことになります。注釈は費用がかからず、貼り付けても残り、`$contentType` の出どころを教えます。枠組みをお使いなら、その属性を上に足してください。
この種のオブジェクトを JSON からどう組み立てますか。
鍵が妥当な名前なら、名前付き引数が使えます。`new Root(...json_decode($body, true))` です。`content-type` や `2fa` のようにそうでない鍵があると展開では名指しできないので、明示的に書きます。`new Root(contentType: $data['content-type'], …)` です。どの鍵を読むかは、各プロパティの隣の注釈が教えます。
ここでの `array` は何を意味しますか。
PHP の配列であり、それ以上細かいことは言いません。この言語に総称型は無いからです。`list<string>` は PHPStan や Psalm といった静的解析器のためのもので、docblock に書きます。お使いなら `/** @var list<string> $tags */` を足してください。この出力は、どの解析器かを当てにいきません。

関連ツール