1
resposta

[Dúvida] [Dúvida] Diferença entre JSON.parse e JSON.stringify no código

Oi pessoal, tudo bem?

O trecho que não entendi é este:

const bibliotecaString = JSON.parse(JSON.stringify(biblioteca));

Aqui está o código completo:

const novoLivro = {
"titulo": "Node.js: Guia Prático",
"autor": "Alice Coder",
"genero": "Tecnologia",
"ano_publicacao": 2022
};

const biblioteca = require("./biblioteca.json");
biblioteca.push(novoLivro);

const bibliotecaString = JSON.parse(JSON.stringify(biblioteca));

console.log(typeof(bibliotecaString));
console.log(bibliotecaString);

Minha dúvida é a seguinte:

Pelo que eu entendi, JSON.stringify() transforma o objeto em string.

Depois, JSON.parse() transforma essa string de volta em objeto.

Só que, olhando para o começo da variável (bibliotecaString), pensei que no final ainda seria uma string, porque termina com JSON.stringify(biblioteca). Mas o resultado é um objeto novamente.

Por que isso acontece? Qual a lógica de terminar com stringify e a saida ser um parse?

1 resposta

Oi Wallace, ótima pergunta! Vou te explicar passo a passo.

O que JSON.stringify() faz:

Esse método pega um objeto JavaScript (como { titulo: "Node.js: Guia Prático" }) e transforma em string no formato JSON.
Exemplo:

const livro = { titulo: "Node.js: Guia Prático" };
const livroString = JSON.stringify(livro);
console.log(typeof livroString); // "string"
console.log(livroString);        // '{"titulo":"Node.js: Guia Prático"}'

O que JSON.parse() faz?

Esse método faz o contrário: ele pega uma string JSON válida e transforma novamente em um objeto JavaScript.
Exemplo:

const texto = '{"titulo":"Node.js: Guia Prático"}';
const livroObjeto = JSON.parse(texto);
console.log(typeof livroObjeto); // "object"
console.log(livroObjeto);        // { titulo: "Node.js: Guia Prático" }

Por que usar os dois juntos?

Quando você escreve:

const bibliotecaString = JSON.parse(JSON.stringify(biblioteca));

acontece o seguinte:

  1. JSON.stringify(biblioteca) transforma a sua biblioteca (um objeto/array) em string.
  2. JSON.parse(...) pega essa string e reconstrói um novo objeto a partir dela.

No fim, bibliotecaString é um objeto de novo, porque o parse "desfaz" a transformação em string.

Mas qual a utilidade disso?

Esse "vai e volta" serve para criar uma cópia independente (deep copy) do objeto original.

  • Se você só fizesse:

    const copia = biblioteca;
    

    a variável copia continuaria apontando para o mesmo objeto na memória. Qualquer alteração em copia também mudaria biblioteca.

  • Já com:

    const copia = JSON.parse(JSON.stringify(biblioteca));
    

    você tem um novo objeto, separado do original.
    Assim, mudanças em copia não afetam biblioteca.

Espero ter ajudado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!