Domanda

C'è un modo per convertire JSON in XML in Ruby?

È stato utile?

Soluzione

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)

Si noti inoltre l'argomento principale di to_xml. Se non si specifica una radice si userà la parola 'hash' come la radice che non è molto piacevole da guardare.

Altri suggerimenti

Per quanto riguarda @rwilliams alias risposta r-dub:

ActiveSupport spostato suoi componenti in moduli separati per granularità. Invece di carico tutto in una volta, siamo in grado di dirgli di caricare solo alcuni sottoinsiemi, o, se vogliamo ancora scegliere, possiamo caricare tutto in una volta. Non importa cosa, non possiamo usare require 'activesupport' come una volta, invece dobbiamo usare require 'activesupport/all' o uno dei sottoinsiemi.

>> 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"

Inoltre, ActiveSupport contiene il supporto di JSON, in modo da poter fare l'intero conversione 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"

I primi carichi di linea in XML e JSON conversioni. Secondi gruppi allineare un campione JSON all'uso per il test. La terza linea prende il JSON finta, decodifica, poi lo converte in XML.

Le altre risposte non consentono per semplici conversioni ricorsive. Come spiegato in questa risposta su Code Review , avrete bisogno di un aiuto personalizzato per creare il semplice formato sei cercando.

Sarà trasformare questo ...

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' } ]
      } ]
  },
]

... in questo modo:

<?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>

Non so una gemma magica per farlo, ma cosa si può fare facilmente è XML per hash e hash per JSON.

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

poi

require 'json'
my_json = my_hash.to_json
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top