Convertir JSON a Ruby Hash Online
Convierte JSON a Hash, Struct u OpenStruct de Ruby. Gratis, en tu navegador, sin subir archivos.
{
name: "John",
age: 30,
active: true,
tags: [
"ruby",
"rails"
],
address: {
city: "Tokyo",
zip: "100-0001"
}
}Qué puedes hacer
JSON a Ruby: Hash, Struct y OpenStruct idiomáticos
Múltiples formatos
Hash con symbols, Hash con strings, Struct.new o OpenStruct según tu patrón de uso en Ruby o Rails.
100% privado
La conversión ocurre en tu navegador con JavaScript. Tu código nunca sale de tu dispositivo.
Ruby idiomático
Código generado siguiendo las convenciones de Ruby 3.x y el Rubocop style guide.
Instantáneo
Conversión en tiempo real mientras escribes. Sin botones, sin esperas.
Cómo funciona
Tres pasos, sin complicaciones
Pega tu JSON
Introduce cualquier objeto JSON válido: simples, anidados, con arrays o campos complejos. La validación ocurre en tiempo real en tu navegador.
Elige el tipo de salida
Selecciona Hash con claves symbol, Hash con claves string, Struct.new o OpenStruct según el patrón de uso en tu código Ruby o Rails.
Copia el código Ruby
Obtén código Ruby idiomático listo para pegar en tu proyecto, con la sintaxis correcta para la versión de Ruby que uses (2.7+ o 3.x).
Preguntas frecuentes
¿Tienes dudas?
Depende del contexto de uso en tu código Ruby. Las claves symbol (:nombre, :edad) son el patrón dominante en Ruby idiomático por varias razones: los symbols son inmutables y únicos en memoria (Ruby mantiene una tabla global de symbols, por lo que :nombre siempre es el mismo objeto en toda la sesión), lo que los hace más eficientes para claves de Hash que se usan repetidamente. La sintaxis moderna de Ruby (desde 1.9) con { nombre: valor } (colon syntax) es más limpia y legible que la hashrocket { :nombre => valor }. Los frameworks como Rails usan symbols en todas sus APIs internas (params[:user_id], session[:user], flash[:notice]). Por otro lado, las claves string ('nombre', 'edad') son útiles cuando los datos vienen de JSON externo y se manipulan sin conversión, cuando las claves contienen caracteres no válidos para symbols (guiones, espacios, puntos), o cuando se usa HashWithIndifferentAccess de ActiveSupport que acepta ambos tipos de clave indistintamente.
Hash es la estructura de datos más flexible y la elección predeterminada para datos JSON en Ruby. Un Hash no tiene un esquema fijo: puedes añadir y eliminar claves dinámicamente. Es ideal para datos de configuración, respuestas de API con estructura variable, y cualquier dato que varíe en estructura. Struct.new(:campo1, :campo2) crea una clase con atributos fijos y acceso mediante métodos (objeto.campo1 en lugar de objeto[:campo1]). Los Struct son más rápidos que OpenStruct, consumen menos memoria, son comparables por valor (dos Struct con los mismos valores son iguales), y son una buena elección cuando conoces exactamente la estructura de los datos en tiempo de diseño. OpenStruct (de la biblioteca estándar ostruct) acepta atributos dinámicos como un Hash pero con sintaxis de acceso por método. Es conveniente para prototipado rápido pero tiene penalizaciones de rendimiento significativas: en benchmarks, OpenStruct es 10-50x más lento que Hash para acceso a atributos en Ruby 2.x, aunque Ruby 3.x mejoró significativamente su implementación.
Ruby incluye la biblioteca json en su biblioteca estándar desde Ruby 1.9 (2007). No requiere instalar ninguna gema adicional. El uso básico es: require 'json'; datos = JSON.parse(json_string). Por defecto, JSON.parse devuelve un Hash con claves string (las mismas que en el JSON original). Para obtener claves symbol, usa JSON.parse(json_string, symbolize_names: true). La opción symbolize_names convierte recursivamente todas las claves string en symbols, incluyendo claves en objetos anidados. Para generar JSON desde Ruby: JSON.generate(objeto) o objeto.to_json (método añadido por la biblioteca json a Hash, Array y los tipos primitivos). La gema json_pure es la implementación pura en Ruby; la gema json (incluida por defecto en MRI Ruby/CRuby) usa una extensión C para mayor rendimiento. En JRuby y TruffleRuby, la implementación de JSON usa el runtime Java subyacente.
Sí, y son importantes para código de producción. OpenStruct tiene tres penalizaciones de rendimiento principales: (1) Creación: crear una instancia de OpenStruct es más costoso que crear un Hash porque define métodos de acceso dinámicamente para cada atributo usando define_method. (2) Acceso: acceder a un atributo de OpenStruct (objeto.nombre) es más lento que acceder a un Hash (hash[:nombre]) porque pasa por method_missing o los métodos definidos dinámicamente, añadiendo overhead de despacho de métodos. (3) Memoria: cada instancia de OpenStruct tiene overhead adicional sobre Hash. En Ruby 2.7 y anteriores, los benchmarks mostraban OpenStruct 10-50x más lento que Hash. Ruby 3.0 introdujo mejoras significativas en OpenStruct (implementación reescrita en C en lugar de Ruby puro) reduciendo la brecha, pero OpenStruct sigue siendo más lento que Hash y Struct para acceso intensivo. La recomendación oficial de Ruby 3.x es: preferir Struct sobre OpenStruct cuando el esquema es conocido. Si necesitas acceso por método con esquema fijo y buen rendimiento, usa Struct; si necesitas flexibilidad para prototipado, usa OpenStruct con plena conciencia del coste de rendimiento.
ActiveSupport::HashWithIndifferentAccess (HWIA) es una subclase de Hash incluida en Rails (y disponible como gema activeSupport sin Rails completo) que permite acceder a claves indistintamente por string o symbol. Es el tipo que Rails usa para params: params[:user_id] y params['user_id'] devuelven el mismo valor. Para cargar JSON externo en Rails con acceso indistinto: json_data = JSON.parse(response_body).with_indifferent_access. El método with_indifferent_access está disponible en Hash a través de ActiveSupport. La conversión es recursiva para hashes anidados cuando se usa HashWithIndifferentAccess.new(hash) pero no cuando se usa .with_indifferent_access directamente en hashes anidados (hay que usar deep_symbolize_keys o similar para la conversión profunda). En Rails 7.x, ActionController::Parameters (el objeto params) implementa una semántica similar a HWIA pero con restricciones de seguridad adicionales (requires y permits para Strong Parameters).
Ruby 2.3 introdujo el pragma # frozen_string_literal: true que congela todos los string literals del archivo, haciendo que sean inmutables y compartidos en memoria (similar a como los symbols son únicos). Ruby 3.x continúa promoviendo esta práctica y en el roadmap de Ruby 4.0 se discute habilitarla por defecto. El impacto en código generado con claves string para Hash es: con frozen_string_literal activo, las claves string son congeladas automáticamente, lo que es eficiente para memoria (el mismo string 'nombre' en múltiples hashes puede apuntar al mismo objeto si es un string literal). Sin embargo, si el código intenta mutar una clave string (concatenar, gsub!, etc.) en un archivo con frozen_string_literal, se producirá un FrozenError en tiempo de ejecución. Para código que procesa JSON con claves string en archivos con frozen_string_literal, esto raramente es un problema porque las claves de Hash típicamente no se mutan. La recomendación para proyectos modernos en Ruby 3.x es incluir # frozen_string_literal: true en todos los archivos y usar claves symbol en Hashes de código propio para máxima eficiencia.
Convertir JSON a Ruby Hash, Struct y OpenStruct: guía técnica
La conversión de JSON a estructuras de datos Ruby es una operación fundamental en el desarrollo backend con Ruby y Ruby on Rails. JSON (JavaScript Object Notation, RFC 7159, actualizado en RFC 8259 en 2017) usa un modelo de datos que mapea directamente a los tipos primitivos de Ruby: objetos JSON se convierten a Hash, arrays JSON a Array, strings a String, números a Integer o Float, booleans a true/false, y null a nil. Sin embargo, la decisión de qué tipo de Hash usar (con claves symbol o string) y si usar Hash, Struct u OpenStruct tiene implicaciones importantes para el rendimiento, la legibilidad y la mantenibilidad del código Ruby resultante. La sintaxis de Hash en Ruby ha evolucionado significativamente a lo largo de las versiones del lenguaje. Ruby 1.8 y anteriores solo soportaban la sintaxis hashrocket: { :clave => valor }. Ruby 1.9 (2007) introdujo la sintaxis colon para claves symbol: { clave: valor }, equivalente a { :clave => valor } pero más concisa. Ruby 3.1 (2021) extendió la sintaxis colon para permitir claves string y variables: { 'clave': valor } y la abreviación de valores de variable donde el nombre de la variable coincide con la clave ({ x:, y: } en lugar de { x: x, y: y }). Rubocop, el analizador estático de código Ruby de facto, recomienda en su guía de estilo usar la sintaxis colon ({clave: valor}) cuando todas las claves son symbols, y hashrocket ({ 'clave' => valor }) cuando hay claves string o se mezclan tipos de clave.
Struct en Ruby es una clase generadora de clases: Struct.new(:nombre, :edad) crea una nueva clase anónima (o nombrada si se asigna a una constante) con atributos definidos, métodos de acceso (getters y setters), comparación por valor (==), y métodos de conversión como to_a y to_h. Desde Ruby 2.5, Struct.new acepta un bloque donde se pueden definir métodos adicionales. Desde Ruby 3.2, Struct.new con keyword_init: true permite inicializar con kwargs: Persona.new(nombre: 'Ana', edad: 30) en lugar de Persona.new('Ana', 30). Los Structs en Ruby se usan ampliamente para Value Objects (objetos que representan un valor conceptual sin identidad propia, como un punto geométrico, un rango de fechas, o una dirección postal) y para Data Transfer Objects (DTO) en aplicaciones que siguen patrones de arquitectura limpia. OpenStruct (biblioteca estándar ostruct, require 'ostruct') es una clase que permite crear objetos con atributos dinámicos definidos en el constructor: persona = OpenStruct.new(nombre: 'Ana', edad: 30); persona.nombre #=> 'Ana'. Adicionalmente, se pueden añadir atributos después de la creación: persona.email = 'ana@example.com'. OpenStruct responde a respond_to? correctamente para los atributos definidos. Es especialmente popular para escribir test doubles, stubs y fixtures en tests RSpec y Minitest: OpenStruct.new(id: 1, name: 'Test') es una forma rápida de crear objetos falsos para tests sin implementar clases completas.
En el contexto de Ruby on Rails, la integración de JSON es omnipresente. Las respuestas de APIs externas (REST o GraphQL) se parsean con JSON.parse, los params de peticiones POST con Content-Type application/json se parsean automáticamente por ActionDispatch y están disponibles como ActionController::Parameters (que funciona como HashWithIndifferentAccess con Strong Parameters). Para serialización de modelos ActiveRecord a JSON, Rails incluye el método as_json que acepta opciones como only:, except:, include: para asociaciones, y methods: para métodos virtuales. La gema jbuilder (incluida por defecto en Rails) permite construir respuestas JSON con una DSL de Ruby. La gema ActiveModelSerializers y la más reciente jsonapi-serializer (basada en fast_jsonapi de Netflix) ofrecen serialización de modelos a JSON:API, el estándar de API REST más usado en el ecosistema Rails. Para conversión de JSON a objetos Ruby con validación de tipos y coerción en proyectos modernos de Ruby (2022-2025), las gemas más utilizadas son: dry-struct (de la familia dry-rb) que define tipos con coerción automática y validación de schema; Sorbet con T::Struct para tipado estático en runtime; y ActiveModel::Attributes en Rails que permite definir atributos tipados en modelos no-ActiveRecord. La herramienta que presentamos genera el código base que puede servir como punto de partida para cualquiera de estos patrones más avanzados, o usarse directamente cuando la simplicidad es la prioridad.