Conversión JSON a YAML

Herramienta para convertir entre formatos JSON y YAML

Resumen de la herramienta: Herramienta de Conversión JSON ⇄ YAML

JSON (JavaScript Object Notation) y YAML (YAML Ain't Markup Language) son ambos formatos ampliamente utilizados para intercambio de datos y archivos de configuración. Esta herramienta permite realizar conversiones mutuas entre JSON y YAML de manera sencilla.

¿Qué es Herramienta de Conversión JSON ⇄ YAML?

Herramienta de Conversión JSON ⇄ YAML convierte JSON a YAML rápidamente y entrega un resultado listo para usar.

Cómo usarlo

  1. Pega el contenido de JSON o ingresa parámetros.
  2. Elige YAML como salida y ajusta opciones.
  3. Revisa el resultado y copia o descarga.

Casos de uso comunes

  • Migraciones de formato JSON↔YAML
  • Usar datos JSON en flujos YAML o generación de código
  • Validar la conversión contra especificaciones

❓ Preguntas frecuentes

P1: ¿La conversión falló o quedó vacía?
R: Verifica que el JSON sea válido y completo.

P2: ¿El resultado luce distinto?
R: El formato puede cambiar para ajustarse a las reglas de YAML.

P3: ¿Cómo procesar en lote?
R: Divide en partes pequeñas para mayor estabilidad.

✨ Características Principales

  • 🔄 Conversión Bidireccional: Compatible con conversión en ambas direcciones JSON a YAML y YAML a JSON
  • Validación de Formato: Verificación de sintaxis de datos de entrada y visualización de errores
  • 🎨 Salida Hermosa: Formato en estilo legible
  • 📋 Copia con Un Clic: Los resultados de conversión se pueden copiar directamente
  • 🌐 Soporte Multiidioma: Totalmente compatible con caracteres Unicode como español

📖 Ejemplos de Uso

Conversión JSON → YAML

JSON de Entrada:

{
  "nombre": "ToolMi",
  "version": "1.0.0",
  "descripcion": "Colección de herramientas en línea útiles",
  "caracteristicas": [
    "Conversión JSON",
    "Conversión YAML",
    "Validación de datos"
  ],
  "configuracion": {
    "debug": true,
    "puerto": 3000,
    "baseDatos": {
      "host": "localhost",
      "puerto": 5432
    }
  }
}

YAML Convertido:

nombre: ToolMi
version: 1.0.0
descripcion: Colección de herramientas en línea útiles
caracteristicas:
  - Conversión JSON
  - Conversión YAML
  - Validación de datos
configuracion:
  debug: true
  puerto: 3000
  baseDatos:
    host: localhost
    puerto: 5432

Conversión YAML → JSON

YAML de Entrada:

# Configuración de aplicación
app:
  nombre: Aplicación de Ejemplo
  version: 2.1.0
  
servidor:
  host: 0.0.0.0
  puerto: 8080
  ssl:
    habilitado: true
    rutaCertificado: /etc/ssl/cert.pem
    
baseDatos:
  tipo: postgresql
  host: localhost
  puerto: 5432
  credenciales:
    usuario: admin
    contraseña: secreto

JSON Convertido:

{
  "app": {
    "nombre": "Aplicación de Ejemplo",
    "version": "2.1.0"
  },
  "servidor": {
    "host": "0.0.0.0",
    "puerto": 8080,
    "ssl": {
      "habilitado": true,
      "rutaCertificado": "/etc/ssl/cert.pem"
    }
  },
  "baseDatos": {
    "tipo": "postgresql",
    "host": "localhost",
    "puerto": 5432,
    "credenciales": {
      "usuario": "admin",
      "contraseña": "secreto"
    }
  }
}

🎯 Escenarios de Aplicación

1. Gestión de Archivos de Configuración

Conversión de formato de configuración de aplicaciones:

// Utilidad de conversión de archivos de configuración
class ConvertidorConfiguracion {
  constructor() {
    this.analizadorYaml = require('js-yaml');
  }

  // Convertir configuración JSON a YAML
  jsonAYaml(configuracionJson) {
    try {
      const objetoConfiguracion = typeof configuracionJson === 'string' 
        ? JSON.parse(configuracionJson) 
        : configuracionJson;
      
      return this.analizadorYaml.dump(objetoConfiguracion, {
        indent: 2,
        lineWidth: 120,
        noRefs: true
      });
    } catch (error) {
      throw new Error(`Error de conversión JSON→YAML: ${error.message}`);
    }
  }

  // Convertir configuración YAML a JSON
  yamlAJson(configuracionYaml, bonito = true) {
    try {
      const objetoConfiguracion = this.analizadorYaml.load(configuracionYaml);
      
      return bonito 
        ? JSON.stringify(objetoConfiguracion, null, 2)
        : JSON.stringify(objetoConfiguracion);
    } catch (error) {
      throw new Error(`Error de conversión YAML→JSON: ${error.message}`);
    }
  }

  // Validar configuración
  validarConfiguracion(configuracion, formato) {
    try {
      if (formato === 'json') {
        JSON.parse(configuracion);
        return { valido: true, mensaje: 'Formato JSON correcto' };
      } else if (formato === 'yaml') {
        this.analizadorYaml.load(configuracion);
        return { valido: true, mensaje: 'Formato YAML correcto' };
      }
    } catch (error) {
      return { 
        valido: false, 
        mensaje: `Error de formato ${formato.toUpperCase()}: ${error.message}` 
      };
    }
  }

  // Migrar configuración
  migrarConfiguracion(configuracionAntigua, formatoAntiguo, formatoNuevo) {
    try {
      // Validar formato original
      const validacion = this.validarConfiguracion(configuracionAntigua, formatoAntiguo);
      if (!validacion.valido) {
        throw new Error(validacion.mensaje);
      }

      // Ejecutar conversión
      if (formatoAntiguo === 'json' && formatoNuevo === 'yaml') {
        return this.jsonAYaml(configuracionAntigua);
      } else if (formatoAntiguo === 'yaml' && formatoNuevo === 'json') {
        return this.yamlAJson(configuracionAntigua);
      } else {
        throw new Error('Formato de conversión no soportado');
      }
    } catch (error) {
      throw new Error(`Error de migración de configuración: ${error.message}`);
    }
  }
}

// Ejemplo de uso
const convertidor = new ConvertidorConfiguracion();

// Migrar configuración JSON existente a YAML
const configuracionJson = `{
  "baseDatos": {
    "host": "localhost",
    "puerto": 5432,
    "nombre": "miapp"
  },
  "redis": {
    "host": "localhost",
    "puerto": 6379
  }
}`;

try {
  const configuracionYaml = convertidor.migrarConfiguracion(configuracionJson, 'json', 'yaml');
  console.log('Archivo de configuración YAML:');
  console.log(configuracionYaml);
} catch (error) {
  console.error('Error de conversión:', error.message);
}

2. Conversión de Documentación API

Conversión de formato de especificaciones OpenAPI:

// Convertidor de especificaciones OpenAPI
class ConvertidorOpenAPI {
  constructor() {
    this.yaml = require('js-yaml');
  }

  // Convertir especificación OpenAPI JSON a YAML
  convertirAYaml(openApiJson) {
    try {
      const especificacion = typeof openApiJson === 'string' 
        ? JSON.parse(openApiJson) 
        : openApiJson;

      // Validación básica de especificación OpenAPI
      if (!especificacion.openapi && !especificacion.swagger) {
        throw new Error('No es una especificación OpenAPI válida');
      }

      return this.yaml.dump(especificacion, {
        indent: 2,
        lineWidth: 120,
        noRefs: true,
        sortKeys: false
      });
    } catch (error) {
      throw new Error(`Error de conversión OpenAPI: ${error.message}`);
    }
  }

  // Convertir especificación OpenAPI YAML a JSON
  convertirAJson(openApiYaml, minificar = false) {
    try {
      const especificacion = this.yaml.load(openApiYaml);

      // Validación básica de especificación OpenAPI
      if (!especificacion.openapi && !especificacion.swagger) {
        throw new Error('No es una especificación OpenAPI válida');
      }

      return minificar 
        ? JSON.stringify(especificacion)
        : JSON.stringify(especificacion, null, 2);
    } catch (error) {
      throw new Error(`Error de conversión OpenAPI: ${error.message}`);
    }
  }

  // Extraer información de especificación
  extraerInfoApi(especificacion) {
    try {
      const especificacionApi = typeof especificacion === 'string' 
        ? this.yaml.load(especificacion) 
        : especificacion;

      return {
        version: especificacionApi.openapi || especificacionApi.swagger,
        titulo: especificacionApi.info?.title || 'Título no establecido',
        descripcion: especificacionApi.info?.description || 'Sin descripción',
        version: especificacionApi.info?.version || '1.0.0',
        servidores: especificacionApi.servers || [],
        conteoRutas: Object.keys(especificacionApi.paths || {}).length,
        conteoComponentes: Object.keys(especificacionApi.components?.schemas || {}).length
      };
    } catch (error) {
      throw new Error(`Error de análisis de especificación: ${error.message}`);
    }
  }
}

// Ejemplo de uso
const convertidorApi = new ConvertidorOpenAPI();

// Especificación OpenAPI de ejemplo (JSON)
const openApiJson = {
  "openapi": "3.0.0",
  "info": {
    "title": "API ToolMi",
    "description": "Especificación API de herramientas útiles",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://api.toolmi.com/v1",
      "description": "Entorno de producción"
    }
  ],
  "paths": {
    "/herramientas": {
      "get": {
        "summary": "Obtener lista de herramientas",
        "responses": {
          "200": {
            "description": "Éxito",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Herramienta"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Herramienta": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "nombre": {
            "type": "string"
          },
          "descripcion": {
            "type": "string"
          }
        }
      }
    }
  }
};

// Conversión JSON → YAML
try {
  const especificacionYaml = convertidorApi.convertirAYaml(openApiJson);
  console.log('Especificación OpenAPI en formato YAML:');
  console.log(especificacionYaml);

  // Extraer información de especificación
  const infoApi = convertidorApi.extraerInfoApi(openApiJson);
  console.log('Información API:', infoApi);
} catch (error) {
  console.error('Error de conversión:', error.message);
}

3. Configuración de Pipeline CI/CD

Conversión de configuración de GitHub Actions y Docker:

// Convertidor de configuración CI/CD
class ConvertidorConfiguracionCICD {
  constructor() {
    this.yaml = require('js-yaml');
  }

  // Convertir configuración de GitHub Actions
  convertirGitHubActions(configuracion, formatoDestino) {
    try {
      if (formatoDestino === 'yaml') {
        const flujoTrabajo = typeof configuracion === 'string' ? JSON.parse(configuracion) : configuracion;
        return this.yaml.dump(flujoTrabajo, { indent: 2 });
      } else {
        const flujoTrabajo = this.yaml.load(configuracion);
        return JSON.stringify(flujoTrabajo, null, 2);
      }
    } catch (error) {
      throw new Error(`Error de conversión de configuración GitHub Actions: ${error.message}`);
    }
  }

  // Convertir configuración de Docker Compose
  convertirDockerCompose(configuracion, formatoDestino) {
    try {
      if (formatoDestino === 'yaml') {
        const compose = typeof configuracion === 'string' ? JSON.parse(configuracion) : configuracion;
        return this.yaml.dump(compose, { indent: 2 });
      } else {
        const compose = this.yaml.load(configuracion);
        return JSON.stringify(compose, null, 2);
      }
    } catch (error) {
      throw new Error(`Error de conversión de configuración Docker Compose: ${error.message}`);
    }
  }

  // Validar archivo de configuración
  validarConfiguracionCI(configuracion, tipo) {
    try {
      const objetoConfiguracion = typeof configuracion === 'string' ? this.yaml.load(configuracion) : configuracion;
      
      switch (tipo) {
        case 'github-actions':
          if (!objetoConfiguracion.on || !objetoConfiguracion.jobs) {
            throw new Error('Faltan campos requeridos en configuración GitHub Actions');
          }
          break;
        case 'docker-compose':
          if (!objetoConfiguracion.version || !objetoConfiguracion.services) {
            throw new Error('Faltan campos requeridos en configuración Docker Compose');
          }
          break;
        default:
          throw new Error('Tipo de configuración no soportado');
      }

      return { valido: true, mensaje: 'Configuración correcta' };
    } catch (error) {
      return { valido: false, mensaje: error.message };
    }
  }
}

// Ejemplo de uso
const convertidorCicd = new ConvertidorConfiguracionCICD();

// Configuración GitHub Actions de ejemplo (YAML)
const githubActionsYaml = `
name: Pipeline CI/CD
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Configurar Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      - name: Instalar dependencias
        run: npm ci
      - name: Ejecutar pruebas
        run: npm test
`;

try {
  // Conversión YAML → JSON
  const configuracionJson = convertidorCicd.convertirGitHubActions(githubActionsYaml, 'json');
  console.log('Configuración GitHub Actions en formato JSON:');
  console.log(configuracionJson);

  // Validar configuración
  const validacion = convertidorCicd.validarConfiguracionCI(githubActionsYaml, 'github-actions');
  console.log('Resultado de validación:', validacion);
} catch (error) {
  console.error('Error de conversión:', error.message);
}

🔧 Detalles Técnicos

Comparación de Características JSON y YAML

Característica JSON YAML
Legibilidad Media Alta
Tamaño de archivo Pequeño Grande
Comentarios No
Cadenas multilínea No
Tipos de datos Limitados Ricos
Velocidad de análisis Rápida Media

Consideraciones de Conversión

// Consideraciones y mejores prácticas de conversión
const mejoresPracticasConversion = {
  // Manejo de comentarios
  comentarios: {
    problema: 'JSON no soporta comentarios, se pierden al convertir YAML→JSON',
    solucion: 'Registrar información importante en campos description en lugar de comentarios'
  },

  // Diferencias de tipos de datos
  tiposDatos: {
    problema: 'YAML expresa fechas, null, booleanos de manera más flexible',
    solucion: 'Verificar tipos de datos después de conversión y ajustar según sea necesario'
  },

  // Cadenas multilínea
  cadenaMultilinea: {
    problema: 'Cadenas multilínea YAML (|, >) se convierten en cadenas simples en JSON',
    solucion: 'Usar caracteres de nueva línea (\\n) para representar'
  },

  // Referencias y anclas
  referencias: {
    problema: 'Anclas (&) y referencias (*) de YAML se expanden en JSON',
    solucion: 'Reconocer que pueden ocurrir datos duplicados'
  }
};

💡 Consejos de Uso

  • Selección de Formato: YAML es adecuado para archivos de configuración, JSON para comunicación API
  • Validación Importante: Siempre verificar integridad de datos antes y después de conversión
  • Uso de Comentarios: Aprovechar comentarios en YAML para mejorar legibilidad
  • Respaldo: Crear respaldo de archivos de configuración importantes antes de conversión

⚠️ Notas Importantes

  • Pérdida de Comentarios: Los comentarios se pierden al convertir YAML→JSON
  • Cambio de Tipos de Datos: Los tipos de datos pueden cambiar durante conversión
  • Errores de Sintaxis: Entrada con formato inválido resultará en error
  • Codificación de Caracteres: Se recomienda usar codificación UTF-8

🚀 Cómo Usar

  1. Entrada de Datos: Pegue los datos JSON o YAML a convertir en el cuadro de entrada
  2. Selección de Dirección de Conversión: Seleccione "JSON→YAML" o "YAML→JSON"
  3. Ejecutar Conversión: Haga clic en el botón "Convertir" para ejecutar conversión
  4. Verificar Resultados: Los resultados de conversión se muestran en el área de salida
  5. Uso de Copia: Use el botón "Copiar" para copiar los resultados al portapapeles

Consejo: Esta herramienta procesa localmente en el lado del cliente y no envía datos al servidor, por lo que la información confidencial también se puede convertir de forma segura.