Clase 02 — Objetos en JSON
Un objeto es una colección desordenada de pares clave-valor, encerrada entre { }.
Reglas de los objetos
- Las claves siempre son strings (comillas dobles)
- Los valores pueden ser cualquier tipo JSON
- Los pares se separan con comas
- No puede haber coma después del último par
- Las claves deben ser únicas
Objetos anidados
{
"servidor": {
"hostname": "web-01",
"hardware": {
"cpu": { "nucleos": 4, "modelo": "Intel Xeon E5", "frecuencia_ghz": 2.4 },
"memoria": { "total_gb": 16, "tipo": "DDR4" },
"disco": { "total_gb": 500, "tipo": "SSD", "raid": "RAID-1" }
},
"red": {
"ip_publica": "203.0.113.10",
"ip_privada": "10.0.1.10",
"mascara": "255.255.255.0",
"dns": ["8.8.8.8", "8.8.4.4"]
}
}
}
Acceder a valores con jq
# Acceder a un campo
jq '.servidor.hostname' servidor.json
# "web-01"
# Campos anidados
jq '.servidor.hardware.cpu.nucleos' servidor.json
# 4
# Múltiples campos
jq '.servidor | {hostname, ip: .red.ip_publica}' servidor.json
# Claves de un objeto
jq '.servidor.hardware | keys' servidor.json
# ["cpu", "disco", "memoria"]
# Verificar si existe una clave
jq '.servidor | has("hostname")' servidor.json
# true
Ejemplo: Política IAM de AWS
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3ReadOnly",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": ["arn:aws:s3:::mi-bucket", "arn:aws:s3:::mi-bucket/*"]
},
{
"Sid": "DenyDeleteBucket",
"Effect": "Deny",
"Action": "s3:DeleteBucket",
"Resource": "*"
}
]
}
Ejemplo: Terraform tfstate (simplificado)
{
"version": 4,
"terraform_version": "1.7.0",
"outputs": {
"instance_ip": { "value": "54.123.45.67", "type": "string" },
"instance_id": { "value": "i-0abc123def456", "type": "string" }
},
"resources": [
{
"type": "aws_instance",
"name": "web_server",
"instances": [{
"attributes": {
"ami": "ami-0abc123def456",
"instance_type": "t3.medium",
"tags": { "Name": "web-server-01", "Environment": "production" }
}
}]
}
]
}
Manipular objetos con jq
# Agregar una clave
echo '{"nombre":"Ana"}' | jq '. + {"edad": 28}'
# Eliminar una clave
echo '{"nombre":"Ana","temp":true}' | jq 'del(.temp)'
# Modificar un valor
echo '{"nombre":"Ana","edad":28}' | jq '.edad = 29'
# Renombrar una clave
echo '{"name":"Ana"}' | jq '{nombre: .name}'
# Iterar sobre pares clave-valor
echo '{"a":1,"b":2,"c":3}' | jq 'to_entries[] | "\(.key) = \(.value)"'
# Merge de dos objetos
echo '{"a":1}' | jq '. * {"b":2, "c":3}'