Like On Facebook

header ads

Guia Completo: Como Manipular Arquivos JSON em Node.js


Neste guia completo, você aprenderá como ler, escrever, atualizar, excluir e até acessar índices específicos de dados em arquivos JSON usando o Node.js.


O que é JSON?

JSON é um formato de texto baseado em JavaScript que representa objetos e arrays de forma estruturada. Ele é usado tanto para troca de dados entre sistemas quanto para armazenamento de informações em arquivos.

Exemplo de arquivo JSON (data.json):
 {
   "users": [
     { "id": 1, "name": "Alice", "email": "alice@example.com" },
     { "id": 2, "name": "Bob", "email": "bob@example.com" },
     { "id": 3, "name": "Charlie", "email": "charlie@example.com" }
   ]
 }

 No Node.js, podemos facilmente converter entre objetos JavaScript e JSON usando JSON.parse() e JSON.stringify().

1. Como Ler um Arquivo JSON 
 
  A leitura de arquivos JSON pode ser feita de forma síncrona ou assíncrona, usando o módulo fs nativo do Node.js. Leitura Síncrona Para ler de maneira síncrona, podemos usar o método fs.readFileSync(). Isso bloqueia a execução até o arquivo ser lido, o que pode ser útil para operações simples e pequenas. 
 
Exemplo:
 import fs from 'fs';

 function readJSONFileSync(filePath) {
   try {
     const data = fs.readFileSync(filePath, 'utf8');
     return JSON.parse(data); // Converte o texto JSON em um objeto JavaScript
   } catch (err) {
     console.error("Erro ao ler o arquivo:", err.message);
     return null;
   }
 }

 // Exemplo de uso
 const users = readJSONFileSync('data.json');
 console.log("Usuários:", users);


Leitura Assíncrona Para leitura assíncrona, usamos o fs.promises.readFile, que retorna uma Promise. Isso é útil para não bloquear a execução do código e realizar outras tarefas enquanto espera a leitura.


Exemplo:

 async function readJSONFileAsync(filePath) {
   try {
     const data = await fs.promises.readFile(filePath, 'utf8');
     return JSON.parse(data);
   } catch (err) {
     console.error("Erro ao ler o arquivo:", err.message);
     return null;
   }
 }

 // Exemplo de uso
 readJSONFileAsync('data.json').then(users => console.log("Usuários:", users));

2. Como Escrever em um Arquivo JSON

Você pode criar ou atualizar arquivos JSON usando fs.writeFileSync() (síncrono) ou fs.promises.writeFile() (assíncrono). Vamos ver os dois exemplos: Escrita Síncrona:
 function writeJSONFileSync(filePath, data) {
   try {
     fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf8'); // Formata o JSON com indentação
     console.log("Arquivo salvo com sucesso!");
   } catch (err) {
     console.error("Erro ao salvar o arquivo:", err.message);
   }
 }

 // Exemplo de uso
 const newData = { users: [{ id: 1, name: "Alice", email: "alice@example.com" }] };
 writeJSONFileSync('data.json', newData);
Escrita Assíncrona

 async function writeJSONFileAsync(filePath, data) {
   try {
     await fs.promises.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8');
     console.log("Arquivo salvo com sucesso!");
   } catch (err) {
     console.error("Erro ao salvar o arquivo:", err.message);
   }
 }

 // Exemplo de uso
 const updatedData = { users: [{ id: 2, name: "Bob", email: "bob@example.com" }] };
 writeJSONFileAsync('data.json', updatedData);


3. Como Acessar um Índice Específico em um Arquivo JSON

Se o seu arquivo JSON contém um array, é comum querer acessar um índice específico desse array.
 

Aqui está como você pode fazer isso. Exemplo de arquivo data.json com uma lista de usuários:

 {
   "users": [
     { "id": 1, "name": "Alice", "email": "alice@example.com" },
     { "id": 2, "name": "Bob", "email": "bob@example.com" },
     { "id": 3, "name": "Charlie", "email": "charlie@example.com" }
   ]
 }
Acessando um Índice Específico Para acessar um item de um array JSON por seu índice, você pode simplesmente utilizar a notação de índice, como faria com qualquer array JavaScript.
 const data = readJSONFileSync('data.json'); // Lê o arquivo
 const userAtIndex1 = data ? data.users[1] : null; // Acessa o usuário no índice 1 (Bob)

 console.log("Usuário no índice 1:", userAtIndex1);

Acessando um Item Pelo Valor (sem índice) Se você não sabe o índice, mas quer encontrar um item baseado em um valor, como o id ou name, você pode usar o método find().
 function findUserById(filePath, userId) {
   const data = readJSONFileSync(filePath);
   if (data && data.users) {
     const user = data.users.find(user => user.id === userId); // Encontra o usuário pelo ID
     return user;
   }
   return null; // Retorna null se não encontrar
 }

 // Exemplo de uso
 const user = findUserById('data.json', 2); // Procurando usuário com ID 2
 console.log("Usuário encontrado:", user);
Acessando de Forma Segura (Verificando Índices) Você pode garantir que está acessando um índice válido, verificando se ele existe no array.
 function getUserAtIndex(filePath, index) {
   const data = readJSONFileSync(filePath);
   if (data && data.users && index >= 0 && index < data.users.length) {
     return data.users[index];
   }
   return null; // Retorna null se o índice não for válido
 }

 // Exemplo de uso
 const userAtIndex = getUserAtIndex('data.json', 1); // Acessando o usuário no índice 1 (Bob)
 console.log("Usuário no índice 1:", userAtIndex);

 

4. Como Atualizar Dados em um Arquivo JSON 

Após acessar e modificar dados em um arquivo JSON, você pode salvá-los de volta no arquivo. Aqui está um exemplo de como atualizar o email de um usuário específico.

 function updateUserEmail(filePath, userId, newEmail) {
   const data = readJSONFileSync(filePath);

   if (data && data.users) {
     const user = data.users.find(user => user.id === userId);
     if (user) {
       user.email = newEmail; // Atualiza o email
       writeJSONFileSync(filePath, data); // Salva as alterações
       console.log(`Email do usuário ${userId} atualizado para ${newEmail}.`);
     } else {
       console.log("Usuário não encontrado.");
     }
   }
 }

 // Exemplo de uso
 updateUserEmail('data.json', 1, 'novaalice@example.com');
5. Como Excluir Dados de um Arquivo JSON Se você quiser remover um item de um array dentro do arquivo JSON, pode usar a função filter() para excluir o item desejado e, em seguida, salvar os dados atualizados.
 function deleteUser(filePath, userId) {
   const data = readJSONFileSync(filePath);
   if (data && data.users) {
     data.users = data.users.filter(user => user.id !== userId); // Remove o usuário
     writeJSONFileSync(filePath, data); // Salva as alterações
     console.log(`Usuário ${userId} removido.`);
   }
 }

 // Exemplo de uso
 deleteUser('data.json', 2);

6. Como Mesclar Arquivos JSON Mesclar arquivos JSON é uma tarefa comum quando você precisa combinar informações de várias fontes em um único arquivo consolidado. No Node.js, isso pode ser feito utilizando operações nativas como o spread operator (...) ou funções de manipulação como Object.assign() e Array.concat(). 6.1 Mesclando Objetos JSON Simples Se os arquivos JSON contêm objetos simples (como chaves e valores), você pode usar o spread operator para combinar os dois objetos. 

 

Exemplo: Arquivo data1.json:

 {
   "name": "Alice",
   "age": 25
 }
Arquivo data2.json:
 { 
   "city": "New York",
   "email": "alice@example.com"
 }
Código para mesclar os dois arquivos:
 function mergeJSONFiles(filePath1, filePath2, outputFile) {
   const data1 = readJSONFileSync(filePath1) || {};
   const data2 = readJSONFileSync(filePath2) || {};

   // Mesclar os dois objetos
   const mergedData = { ...data1, ...data2 };

   // Escrever o arquivo mesclado
   writeJSONFileSync(outputFile, mergedData);
   console.log("Arquivos mesclados com sucesso!");
 }

 // Exemplo de uso
 mergeJSONFiles('data1.json', 'data2.json', 'merged.json');


6.2 Mesclando Arrays em JSON Se os arquivos JSON contêm arrays (listas), você pode usar métodos como concat() para combinar os arrays. 

Exemplo: Arquivo data1.json:

{
  "users": [
    { "id": 1, "name": "Alice" },
    { "id": 2, "name": "Bob" }
  ]
}
Arquivo data2.json:
 {
   "users": [
     { "id": 3, "name": "Charlie" },
     { "id": 4, "name": "Diana" }
   ]
 }
Código para mesclar os dois arrays:
 function mergeJSONArrays(filePath1, filePath2, outputFile) {
   const data1 = readJSONFileSync(filePath1) || {};
   const data2 = readJSONFileSync(filePath2) || {};

   // Mesclar os arrays de 'users'
   const mergedUsers = [...(data1.users || []), ...(data2.users || [])];

   // Criar um novo objeto com o array mesclado
   const mergedData = { users: mergedUsers };

   // Escrever o arquivo mesclado
   writeJSONFileSync(outputFile, mergedData);
   console.log("Arrays mesclados com sucesso!");
 }

 // Exemplo de uso
 mergeJSONArrays('data1.json', 'data2.json', 'merged.json');


6.3 Mesclando Objetos com Arrays Quando os arquivos JSON contêm uma combinação de objetos e arrays, a estratégia depende da estrutura dos dados. 

 

Exemplo: Arquivo data1.json:

 {
   "settings": { "theme": "dark", "language": "en" },
   "users": [
     { "id": 1, "name": "Alice" }
   ]
 }
Arquivo data2.json:
 {
   "settings": { "notifications": true },
   "users": [
     { "id": 2, "name": "Bob" }
   ]
 }
Código para mesclar objetos e arrays:
 function mergeComplexJSON(filePath1, filePath2, outputFile) {
   const data1 = readJSONFileSync(filePath1) || {};
   const data2 = readJSONFileSync(filePath2) || {};

   // Mesclar as configurações (objetos)
   const mergedSettings = { ...(data1.settings || {}), ...(data2.settings || {}) };

   // Mesclar os usuários (arrays)
   const mergedUsers = [...(data1.users || []), ...(data2.users || [])];

   // Criar um novo objeto com os dados mesclados
   const mergedData = { settings: mergedSettings, users: mergedUsers };

   // Escrever o arquivo mesclado
   writeJSONFileSync(outputFile, mergedData);
   console.log("Objetos e arrays mesclados com sucesso!");
 }

 // Exemplo de uso
 mergeComplexJSON('data1.json', 'data2.json', 'merged.json');


6.4 Lidando com Conflitos Durante a Mesclagem
 

Se houver conflitos de chave (por exemplo, chaves duplicadas em objetos ou IDs duplicados em arrays), você pode definir regras personalizadas para resolver os conflitos. 

Exemplo com arrays de usuários: Aqui, vamos evitar duplicação de usuários, garantindo que IDs sejam únicos.

 function mergeJSONAvoidDuplicates(filePath1, filePath2, outputFile) {
   const data1 = readJSONFileSync(filePath1) || {};
   const data2 = readJSONFileSync(filePath2) || {};

   // Mesclar os usuários, removendo duplicatas pelo 'id'
   const allUsers = [...(data1.users || []), ...(data2.users || [])];
   const uniqueUsers = Array.from(new Map(allUsers.map(user => [user.id, user])).values());

   // Criar o novo objeto mesclado
   const mergedData = { users: uniqueUsers };

   // Escrever o arquivo mesclado
   writeJSONFileSync(outputFile, mergedData);
   console.log("Mesclagem com duplicatas resolvidas realizada com sucesso!");
 }

 // Exemplo de uso
 mergeJSONAvoidDuplicates('data1.json', 'data2.json', 'merged.json');
🚀 Conclusão

Mesclar arquivos JSON em Node.js é uma habilidade essencial para gerenciar dados de forma eficiente. Neste guia, cobrimos os cenários mais comuns, como mesclar objetos simples, arrays, combinações complexas e até resolver conflitos de duplicação.


Agora você está pronto para lidar com qualquer tipo de mesclagem em seus projetos! 🚀 Se tiver dúvidas ou sugestões, deixe nos comentários do blog. 😊

Postar um comentário

0 Comentários