Avaliador JSON Merge Patch (RFC 7396) | Resultado da fusão e trace passo a passo
Cole um JSON alvo e um JSON patch para aplicar as regras de fusão da RFC 7396, ver o documento resultante e ler um trace ordenado de cada operação de definir, remover e substituir a raiz.
💡 Sobre esta ferramenta
Ao projetar ou revisar um endpoint HTTP PATCH, normalmente você quer saber o que um corpo de patch realmente faz com o recurso armazenado antes de disparar uma requisição de verdade. A RFC 7396 (JSON Merge Patch) parece simples — você envia um objeto parcial e o servidor faz o merge — mas os casos de borda pegam: null remove um membro, chaves ausentes ficam intactas, objetos aninhados são fundidos de forma recursiva e arrays são substituídos por inteiro em vez de fundidos.
Esta ferramenta tira a dúvida. Cole o alvo e o patch e veja o JSON resultante junto com uma lista numerada do que mudou: definir /title = "Hello World", remover /author/email, e assim por diante. Esse trace é o diferencial: em vez de comparar dois blocos no olho, você lê as operações exatas que a fusão produziu, o que facilita confirmar que a especificação de um PATCH se comporta como esperado e flagrar cedo uma substituição acidental.
🧐 Perguntas frequentes
Q. Qual a diferença em relação ao JSON Patch (RFC 6902)?
A RFC 6902 é um array de operações explícitas — add, remove, replace, move, copy, test — e consegue mirar um índice específico de um array. A RFC 7396 é declarativa: você envia um objeto parcial descrevendo o estado desejado. É mais compacta, mas não permite editar arrays parcialmente nem definir um valor como null. Esta ferramenta implementa apenas a RFC 7396.
Q. Posso alterar um único elemento dentro de um array? Não. Sob a RFC 7396, arrays são valores opacos, então qualquer array no patch substitui o array do alvo por completo. Se você precisa de mudanças no nível do elemento, esse é o sinal para recorrer à RFC 6902.
Q. O que acontece se eu colocar null em uma chave que o alvo não tem?
Nada. Se a chave não existe no alvo, o null é uma operação nula: não há remoção e nada entra no trace.
Q. E se o patch for um escalar ou um array em vez de um objeto? O patch inteiro substitui o alvo (RFC 7396 §2) e o trace mostra uma única entrada de "substituir raiz". Um campo vazio é tratado como null.
Q. A ordem das chaves é preservada? A saída é formatada, então chaves recém-adicionadas podem aparecer mais ao fim. A RFC 7396 não fixa a ordem das chaves, então compare os resultados por equivalência semântica, e não byte a byte.
📚 Por que merge patch é tão usado em APIs
A RFC 7396 ganhou espaço justamente por ser legível para humanos: o corpo do patch se parece com a própria parte do recurso que você quer mudar, sem a verbosidade de um array de operações. Em frameworks de API como os do ecossistema Spring, é comum a escolha entre merge patch e RFC 6902 ser feita pela complexidade da atualização — merge patch para ajustes diretos de campos, RFC 6902 quando se precisa de controle fino sobre arrays ou de verificação com test. O efeito colateral mais citado é a impossibilidade de definir um campo como null pela merge patch, já que null sempre significa remoção. Ver a fusão operação por operação ajuda a estudar esse comportamento e a confirmar onde a recursão para antes de mandar a requisição.