100 % locale — i tuoi dati non lasciano mai il tuo browser

JSON in PHP — classi con proprietà promosse

Trasforma un campione JSON in classi PHP 8 con proprietà promosse nel costruttore. Una proprietà rinominata tiene la chiave originale accanto, in commento.

Istantaneo Privato Zero cookie

Input JSON

Output PHP

Che cosa fa questo strumento

Un campione JSON diventa classi PHP con proprietà promosse nel costruttore.

{ "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,
    ) {
    }
}

La promozione delle proprietà richiede PHP 8.0; l’impostazione readonly richiede 8.1. Il declare(strict_types=1) è lì apposta: senza, PHP convertirebbe in silenzio una stringa in un parametro int, e perderesti proprio il controllo per cui i tipi esistono.

Una proprietà rinominata conserva la sua chiave

Qui i nomi delle proprietà sono in camelCase: una chiave con trattino o che inizia con una cifra non sopravvive come nome. Quando succede, la chiave è scritta accanto:

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

Quest’ultima coppia è la ragione: fooBar e foo-bar vogliono entrambi $fooBar, quindi il secondo diventa $fooBar2 — e senza il commento nulla nel file diceva quale venisse da quale. PHP non ha un attributo standard che lo porti: lo porta un commento, e solo dove il nome non porta più la chiave.

Era una mancanza vera, trovata scrivendo questa pagina: PHP era l’unico di questi generatori a perdere del tutto la chiave. Go ha il suo tag, Java e C# la loro annotazione, Swift le sue CodingKeys, Dart il suo fromJson.

Ciò che PHP non sa restringere

  • array per ogni lista. Il linguaggio non ha generici; list<string> vive in un docblock di PHPStan o Psalm, e quale usi non è qualcosa che un campione possa sapere.
  • mixed per null e i valori ignoti. È il tipo onesto: accetta tutto, e declare(strict_types=1) lì non ti salva. Restringilo appena il campo ha un tipo vero.
  • Uno scalare alla radice è rifiutato. PHP non ha alias di tipo: 42 o "testo" non ha in cosa diventare.

Ciò che un campione non può dire

Nessuna proprietà è annullabile e nessuna ha un valore predefinito: il documento aveva un valore per ciascuna. ?string e = null sono le modifiche da fare quando un secondo carico mostra che la chiave può mancare — e readonly vale la pena se questi oggetti sono fatti per essere letti, non riempiti.

Privato per progettazione

Tutto viene eseguito localmente nel browser con JavaScript. I tuoi dati non vengono mai caricati, quindi lo strumento è sicuro per contenuti sensibili e funziona anche offline.

Domande frequenti

Perché la chiave JSON sta in un commento e non in un attributo?
Perché PHP non ha un attributo standard di mappatura. Symfony vuole `#[SerializedName]`, JMS il suo, e il semplice `json_decode` non ne vuole nessuno — emetterne uno sceglierebbe un framework al posto tuo. Il commento non costa nulla, sopravvive al copia-incolla e ti dice da dove viene `$contentType`. Mettici sopra l’attributo del tuo framework, se ne usi uno.
Come costruisco uno di questi oggetti dal JSON?
Con argomenti nominati quando le chiavi sono nomi validi: `new Root(...json_decode($body, true))`. Quando una chiave non lo è — `content-type`, `2fa` — lo spread non può nominarla: assegna esplicitamente, `new Root(contentType: $data['content-type'], …)`. Il commento accanto a ogni proprietà ti dice quale chiave leggere.
Che cosa vuol dire `array` qui?
Un array PHP, e nulla di più preciso: il linguaggio non ha tipi generici. `list<string>` esiste solo per gli analizzatori statici come PHPStan e Psalm, in un docblock. Se ne usi uno, `/** @var list<string> $tags */` è la riga da aggiungere — questa uscita non indovina quale adoperi.

Convertitori correlati