Saltar al contenido principal

Clase 02 — Objetos en JSON

Un objeto es una colección desordenada de pares clave-valor, encerrada entre { }.

Reglas de los objetos

  1. Las claves siempre son strings (comillas dobles)
  2. Los valores pueden ser cualquier tipo JSON
  3. Los pares se separan con comas
  4. No puede haber coma después del último par
  5. 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}'