100 % local — seus dados nunca saem do seu navegador

JSON para PHP — classes com propriedades promovidas

Transforme uma amostra JSON em classes PHP 8 com propriedades promovidas no construtor. Uma propriedade renomeada guarda a chave original ao lado.

Instantâneo Privado Zero cookies

Entrada JSON

Saída PHP

O que esta ferramenta faz

Uma amostra JSON vira classes PHP com propriedades promovidas ao construtor.

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

A promoção de propriedades pede PHP 8.0; o ajuste readonly pede 8.1. O declare(strict_types=1) está ali de propósito: sem ele, o PHP converteria sem ruído uma string num parâmetro int, e você perderia justamente a checagem que os tipos deviam dar.

Uma propriedade renomeada guarda a sua chave

Os nomes de propriedade aqui vão em camelCase: uma chave com hífen ou começando por dígito não sobrevive como nome. Quando isso acontece, a chave é escrita ao lado:

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

Esse último par é a razão: fooBar e foo-bar querem ambos $fooBar, então o segundo vira $fooBar2 — e sem o comentário nada no arquivo dizia qual vinha de qual. O PHP não tem atributo padrão para carregar isso: carrega um comentário, e só onde o nome já não carrega a chave.

Era uma falta real, encontrada ao escrever esta página: o PHP era o único desses geradores a perder a chave por completo. O Go tem a sua tag, o Java e o C# a sua anotação, o Swift as suas CodingKeys, o Dart o seu fromJson.

O que o PHP não consegue estreitar

  • array para toda lista. A linguagem não tem genéricos; list<string> mora num docblock de PHPStan ou Psalm, e qual deles você usa não é algo que uma amostra saiba.
  • mixed para null e os valores desconhecidos. É o tipo honesto: aceita tudo, e declare(strict_types=1) não te salva ali. Estreite-o assim que o campo tiver um tipo de verdade.
  • Um escalar na raiz é recusado. O PHP não tem alias de tipo: 42 ou "texto" não tem no que virar.

O que uma amostra não consegue dizer

Nenhuma propriedade aceita nulo e nenhuma tem valor padrão: o documento trazia um valor para cada uma. ?string e = null são os retoques a fazer quando uma segunda carga mostrar que a chave pode faltar — e readonly vale a pena se esses objetos existem para ser lidos, não preenchidos.

Privado por padrão

Tudo é executado localmente no seu navegador com JavaScript. Os seus dados nunca são enviados para um servidor, o que torna a ferramenta segura para conteúdo sensível e funciona offline.

Perguntas frequentes

Por que a chave JSON vai num comentário e não num atributo?
Porque o PHP não tem atributo padrão de mapeamento. O Symfony quer `#[SerializedName]`, o JMS o seu, e o `json_decode` puro não quer nenhum — emitir um escolheria um framework por você. O comentário não custa nada, sobrevive ao copiar e colar, e diz de onde veio `$contentType`. Ponha por cima o atributo do seu framework, se usar um.
Como construo um desses objetos a partir de JSON?
Com argumentos nomeados quando as chaves são nomes válidos: `new Root(...json_decode($body, true))`. Quando uma chave não é — `content-type`, `2fa` — o espalhamento não consegue nomeá-la: atribua explicitamente, `new Root(contentType: $data['content-type'], …)`. O comentário ao lado de cada propriedade diz qual chave ler.
O que `array` significa aqui?
Um array do PHP, e nada mais preciso: a linguagem não tem tipos genéricos. `list<string>` só existe para analisadores estáticos como PHPStan e Psalm, num docblock. Se você roda um, `/** @var list<string> $tags */` é a linha a acrescentar — esta saída não adivinha qual você usa.

Conversores relacionados