2010-11-24 28 views

Respuesta

10
require 'active_support' #for to_xml() 'gem install activesupport' use the 2.3 branch 
require 'json' #part of ruby 1.9 but otherwise 'gem install json' 

my_json = "{\"test\":\"b\"}" 
my_xml = JSON.parse(my_json).to_xml(:root => :my_root) 

También tenga en cuenta el argumento de la raíz de to_xml. Si no especifica una raíz, usará la palabra 'hash' como la raíz que no es muy buena de ver.

+0

¿Necesito alguna joya para 'active_support'? Me aparece un error cuando intento 'requerir'. –

+0

sí. Active Support es parte de Ruby on Rails. Debería poder instalarlo con 'gem install activesupport' – rwilliams

+0

Ahora cada vez que intento ejecutarlo, aparece el siguiente error: 'método indefinido' to_xml 'for # (NoMethodError) '. 'JSON.parse' debería devolver un hash, ¿no es así? –

-1

No conozco una joya mágica para hacerlo, pero lo que puedes hacer fácilmente es xml para hash y hash para json.

require 'active_support' 
my_hash = Hash.from_xml(my_xml) 

continuación

require 'json' 
my_json = my_hash.to_json 
+3

Estoy tratando de convertir JSON a XML, no XML a JSON –

+0

¿Funcionan esas citas extrañas, de todos modos? Esto no se ve muy saludable. – jwueller

+0

@elusive: Sí, me parecen originales. Creo que son citas inteligentes. –

6

En cuanto @rwilliams aka r-dub respuesta:

ActiveSupport moved its components en módulos separados para granularidad. En lugar de cargar todo de una vez, podemos decirle que cargue solo ciertos subconjuntos, o, si todavía elegimos, podemos cargar todo a la vez. No importa qué, no podemos usar require 'activesupport' como solíamos hacerlo, en su lugar tenemos que usar require 'activesupport/all' o uno de los subconjuntos.

>> require 'active_support/core_ext/array/conversions' #=> true 
>> [{:a => 1, :b => 2}, {:c => 3}].to_xml 
=> "<?xml version="1.0" encoding="UTF-8"?>\n<objects type="array">\n <objects a="1" b="2" type="hash"/>\n <objects c="3" type="hash"/>\n</objects>\n" 

Además, ActiveSupport contiene soporte JSON, lo que puede hacer la conversión completa con AR:

>> require 'active_support/all' #=> true 
>> json = {'foo'=>'bar'}.to_json #=> "{"foo":"bar"}" 
>> ActiveSupport::JSON.decode(json).to_xml #=> "<?xml version="1.0" encoding="UTF-8"?>\n<hash>\n <foo>bar</foo>\n</hash>\n" 

Las primeras cargas de línea en las conversiones de XML y JSON. La segunda línea configura una muestra JSON para usar para la prueba. La tercera línea toma el supuesto JSON, lo decodifica y luego lo convierte a XML.

1

Las otras respuestas no permiten conversiones recursivas simples. Como se explica en this answer on Code Review, necesitará un ayudante personalizado para crear el formato simple que está buscando.

Es a su vez esta ...

data = [ 
    { 'name' => 'category1', 
    'subCategory' => [ 
     { 'name' => 'subCategory1', 
     'product' => [ 
      { 'name' => 'productName1', 
      'desc' => 'desc1' }, 
      { 'name' => 'productName2', 
      'desc' => 'desc2' } ] 
     } ] 
    }, 
    { 'name' => 'category2', 
    'subCategory' => [ 
     { 'name' => 'subCategory2.1', 
     'product' => [ 
      { 'name' => 'productName2.1.1', 
      'desc' => 'desc1' }, 
      { 'name' => 'productName2.1.2', 
      'desc' => 'desc2' } ] 
     } ] 
    }, 
] 

... en esto:

<?xml version="1.0"?> 
<root> 
    <category> 
    <name>category1</name> 
    <subCategory> 
     <name>subCategory1</name> 
     <product> 
     <name>productName1</name> 
     <desc>desc1</desc> 
     </product> 
     <product> 
     <name>productName2</name> 
     <desc>desc2</desc> 
     </product> 
    </subCategory> 
    </category> 
    <category> 
    <name>category2</name> 
    <subCategory> 
     <name>subCategory2.1</name> 
     <product> 
     <name>productName2.1.1</name> 
     <desc>desc1</desc> 
     </product> 
     <product> 
     <name>productName2.1.2</name> 
     <desc>desc2</desc> 
     </product> 
    </subCategory> 
    </category> 
</root>