Tengo una cadena JSON serializada (definición de rol de chef en realidad) y tiene una clave json_class, haciendo que el analizador rubsen JSON intente forzarlo a ser un objeto Chef :: Role. ¿Cómo puedo hacer que el analizador ignore esta clave y simplemente deserialice en una Hash normal?¿Cómo hacer que el analizador de Ruby JSON ignore json_class?
Respuesta
yo sólo tenía el mismo problema, y encontró la respuesta mediante la lectura de la fuente de la gema JSON - simplemente desarmar JSON.create_id antes de tratar de hacer el análisis sintáctico:
JSON.create_id = nil
JSON.parse('{ "json_class": "Chef::Role" }').class => Hash
EDIT: Nota que desde la versión 1.7 de la gema (1.8.0 es actual mientras escribo esta actualización), el truco anterior ya no es necesario. JSON#parse
ahora ignora json_class
, y JSON#load
se debe utilizar en su lugar para deshabilitar objetos volcados.
podría hacer un gsub
en la cadena antes del análisis, y cambiar esa clave en particular a otra cosa.
¿Qué le parece mostrar una muestra de JSON antes y después?
La clave "json_class" está allí para indicar en qué objeto se debe desasignar el json. Es agregado por JSON.dump. En versiones más recientes de JSON, JSON.parse
ignorará "json_class", desmarcando a Hash. Mientras JSON.load
se desmarcará al Objeto indicado (en su caso, un Chef :: Rol).
JSON.parse('{ "json_class": "Chef::Role" }').class => Hash
JSON.load('{ "json_class": "Chef::Role" }').class => Chef::Role
Gracias para la actualización, Matt. He editado mi respuesta para reflejar eso para los transeúntes en el futuro. –
De acuerdo con los documentos, la solución de Mark Reed sin duda debería funcionar. Pero cuando he intentado esto en un Vagrantfile:
JSON.create_id = nil
vagrant_json = JSON.parse(Pathname(__FILE__).dirname.join('nodes', "#{node_name}.json").read)
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.roles_path = "roles"
chef.data_bags_path = "data_bags"
chef.node_name = node_name
chef.run_list = vagrant_json.delete('run_list')
chef.json = vagrant_json
end
la vagrant_json.class era un hash, pero todavía conserva el valor json_class internamente cada vez que el archivo node.json contenía el "json_class" : "Chef :: Nodo " entrada. Luego, al usar el hash para establecer el valor chef.json en la última línea, se interpretó de nuevo usando la clase json (y el resultado fue, curiosamente, una lista de ejecución vacía)
Esto es lo que funcionó. La misma idea, pero un poco menos finura:
vagrant_json = JSON.parse(Pathname(__FILE__).dirname.join('nodes', "#{node_name}.json").read)
vagrant_json['json_class'] = nil # <== This worked
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.roles_path = "roles"
chef.data_bags_path = "data_bags"
chef.node_name = node_name
chef.run_list = vagrant_json.delete('run_list')
chef.json = vagrant_json
end
Este código trabajaron para establecer tanto los atributos JSON y la lista de ejecución de un archivo de nodo Chef, con o sin el "json_class" : "Chef :: nodo" entrada.
En resumen, la respuesta anterior parece completamente correcta en relación con obtener un hash de JSON.parse, pero si no quita el par json_class de ese hash, aún puede haber problemas más adelante, como en este caso .
- 1. ¿Cómo hacer que Hibernate ignore un método?
- 2. ¿Cómo puedo hacer que el cliente xmlrpc de ruby ignore los errores del certificado SSL?
- 3. Cómo hacer que MPMoviePlayerController ignore el interruptor de silencio
- 4. ¿Cómo hacer que javascript ignore el carácter de escape (\)?
- 5. ¿Cómo hacer que git ignore los cambios en el caso?
- 6. Hacer que Python ignore los archivos .pyc
- 7. ¿Cómo hacer que 'svn log' ignore los cambios de propiedad?
- 8. ¿Cómo hago que Pyflakes ignore una declaración?
- 9. Analizador JSON para J2ME
- 10. JSON para el analizador de Groovy
- 11. Hacer que Emacs ignore el diseño del teclado del sistema
- 12. ¿Qué puede hacer que CGDisplayCreateImageForRect capture o ignore el cursor?
- 13. ¿Cómo puedo hacer que Subversion ignore un directorio?
- 14. ¿Cómo hacer que .gitignore ignore los archivos compilados sin extensión?
- 15. Cómo hacer que Varnish ignore, no elimine las cookies
- 16. ¿Cómo hacer que Proguard ignore las bibliotecas externas?
- 17. Cómo hacer que SVN ADD ignore los binarios
- 18. Cómo hacer que Git en Windows ignore los enlaces simbólicos
- 19. ¿Cómo hacer que mercurial ignore todos los archivos ocultos?
- 20. ¿Cómo puedo hacer que Inno Setup ignore los directorios vacíos?
- 21. cómo hacer analizador Scala falle
- 22. .NET JSON comparación de analizador
- 23. ¿Cómo hago que curl ignore el proxy?
- 24. ¿El mejor analizador JSON para Qt?
- 25. JavaScript no recursivo Analizador JSON
- 26. Analizador JSON recomendado en C?
- 27. ¿Puedo hacer que git diff ignore los cambios de permisos?
- 28. cómo hacer que httpPost llame con el cuerpo json codificado?
- 29. Cómo hacer git diff --ignore-space-change el predeterminado
- 30. ¿Cómo hacer que una aplicación ignore el cambio de orientación de la pantalla?
Guau, eso parece un truco, pero realmente es la API documentada: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/JSON.html#create_id – jes5199