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().
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');
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. 😊
0 Comentários