100 % local — vos données ne quittent jamais votre navigateur

JSON en PHP — des classes à propriétés promues

Transformez un échantillon JSON en classes PHP 8 à propriétés promues. Une propriété renommée garde la clé d’origine en commentaire, juste à côté.

Instantané Privé Zéro cookie

Entrée JSON

Sortie PHP

Ce que fait cet outil

Un échantillon JSON devient des classes PHP à propriétés promues au constructeur.

{ "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 promotion de propriétés demande PHP 8.0 ; le réglage readonly demande 8.1. Le declare(strict_types=1) est là exprès : sans lui, PHP convertirait sans bruit une chaîne en paramètre int, et vous perdriez le contrôle que les types devaient vous donner.

Une propriété renommée garde sa clé

Les noms de propriétés sont en camelCase ici : une clé à tiret ou commençant par un chiffre ne survit donc pas comme nom. Quand cela arrive, la clé est écrite à côté :

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

Cette dernière paire en est la raison : fooBar et foo-bar veulent tous deux $fooBar, le second devient donc $fooBar2 — et sans le commentaire, rien dans le fichier ne disait laquelle venait de laquelle. PHP n’a pas d’attribut standard pour porter cela : un commentaire le fait, et seulement là où le nom ne porte plus la clé.

C’était un vrai manque, trouvé en écrivant cette page : PHP était le seul de ces générateurs à perdre la clé entièrement. Go a son tag, Java et C# leur annotation, Swift ses CodingKeys, Dart son fromJson.

Ce que PHP ne sait pas restreindre

  • array pour toute liste. Le langage n’a pas de génériques ; list<string> vit dans un docblock PHPStan ou Psalm, et lequel vous employez n’est pas quelque chose qu’un échantillon puisse savoir.
  • mixed pour null et les valeurs inconnues. C’est le type honnête : il accepte tout, et declare(strict_types=1) ne vous sauvera pas là. Restreignez-le dès que le champ a un vrai type.
  • Un scalaire à la racine est refusé. PHP n’a pas d’alias de type : 42 ou "texte" n’a rien à devenir.

Ce qu’un échantillon ne peut pas dire

Aucune propriété n’est nullable et aucune n’a de valeur par défaut : le document avait une valeur pour chacune. ?string et = null sont les retouches à faire quand une seconde charge montre que la clé peut manquer — et readonly vaut la peine d’être activé si ces objets sont faits pour être lus, pas remplis.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Pourquoi la clé JSON est-elle dans un commentaire plutôt qu’un attribut ?
Parce que PHP n’a pas d’attribut standard de mappage. Symfony veut `#[SerializedName]`, JMS le sien, et `json_decode` tout court n’en veut aucun — en émettre un choisirait un cadre à votre place. Le commentaire ne coûte rien, survit au copier-coller, et vous dit d’où vient `$contentType`. Ajoutez par-dessus l’attribut de votre cadre si vous en employez un.
Comment construire un de ces objets depuis du JSON ?
Avec des arguments nommés quand les clés sont des noms valides : `new Root(...json_decode($body, true))`. Quand une clé ne l’est pas — `content-type`, `2fa` — l’étalement ne peut pas la nommer : affectez explicitement, `new Root(contentType: $data['content-type'], …)`. Le commentaire à côté de chaque propriété vous dit quelle clé lire.
Que veut dire `array` ici ?
Un tableau PHP, et rien de plus précis : le langage n’a pas de types génériques. `list<string>` n’existe que pour les analyseurs statiques comme PHPStan et Psalm, dans un docblock. Si vous en faites tourner un, `/** @var list<string> $tags */` est la ligne à ajouter — cette sortie ne devine pas lequel vous employez.

Convertisseurs associés