100 % local: tus datos nunca salen de tu navegador

JSON a PHP — clases con propiedades promovidas

Convierte una muestra JSON en clases PHP 8 con propiedades promovidas en el constructor. Una propiedad renombrada guarda la clave original al lado.

Instantáneo Privado Cero cookies

Entrada JSON

Salida PHP

Qué hace esta herramienta

Una muestra JSON pasa a ser clases de PHP con propiedades promovidas al constructor.

{ "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 promoción de propiedades pide PHP 8.0; el ajuste readonly pide 8.1. El declare(strict_types=1) está ahí a propósito: sin él, PHP convertiría sin ruido una cadena en un parámetro int, y perderías el control que los tipos debían darte.

Una propiedad renombrada conserva su clave

Los nombres de propiedad van en camelCase aquí: una clave con guion o que empiece por dígito no sobrevive como nombre. Cuando eso pasa, la clave se escribe al lado:

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

Ese último par es la razón: fooBar y foo-bar quieren ambos $fooBar, así que el segundo pasa a $fooBar2, y sin el comentario nada en el archivo decía cuál venía de cuál. PHP no tiene un atributo estándar que lo lleve: lo lleva un comentario, y solo donde el nombre ya no lleva la clave.

Era una carencia real, encontrada al escribir esta página: PHP era el único de estos generadores que perdía la clave por completo. Go tiene su tag, Java y C# su anotación, Swift sus CodingKeys, Dart su fromJson.

Lo que PHP no sabe estrechar

  • array para toda lista. El lenguaje no tiene genéricos; list<string> vive en un docblock de PHPStan o Psalm, y cuál usas no es algo que una muestra pueda saber.
  • mixed para null y los valores desconocidos. Es el tipo honesto: lo acepta todo, y declare(strict_types=1) no te salvará ahí. Estréchalo en cuanto el campo tenga un tipo real.
  • Un escalar en la raíz se rechaza. PHP no tiene alias de tipo: 42 o "texto" no tiene en qué convertirse.

Lo que una muestra no puede decir

Ninguna propiedad admite nulos y ninguna tiene valor por defecto: el documento traía un valor para cada una. ?string y = null son los retoques que harás cuando una segunda carga muestre que la clave puede faltar, y readonly merece activarse si estos objetos están hechos para leerse, no para rellenarse.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿Por qué la clave JSON va en un comentario y no en un atributo?
Porque PHP no tiene un atributo estándar de mapeo. Symfony quiere `#[SerializedName]`, JMS el suyo, y `json_decode` a secas no quiere ninguno: emitir uno elegiría un framework por ti. El comentario no cuesta nada, sobrevive al copiar y pegar, y te dice de dónde viene `$contentType`. Añade encima el atributo de tu framework si usas uno.
¿Cómo construyo uno de estos objetos desde JSON?
Con argumentos nombrados cuando las claves son nombres válidos: `new Root(...json_decode($body, true))`. Cuando una clave no lo es —`content-type`, `2fa`— el desplegado no puede nombrarla: asigna explícitamente, `new Root(contentType: $data['content-type'], …)`. El comentario junto a cada propiedad te dice qué clave leer.
¿Qué significa `array` aquí?
Un array de PHP, y nada más preciso: el lenguaje no tiene tipos genéricos. `list<string>` solo existe para analizadores estáticos como PHPStan y Psalm, en un docblock. Si usas uno, `/** @var list<string> $tags */` es la línea que añadir; esta salida no adivina cuál empleas.

Convertidores relacionados