Как я могу конвертировать JSON в XML в Ruby? - PullRequest
10 голосов
/ 25 ноября 2010

Есть ли способ конвертировать JSON в XML в Ruby?

Ответы [ 4 ]

11 голосов
/ 25 ноября 2010
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)

Также обратите внимание на корневой аргумент to_xml. Если вы не укажете корень, он будет использовать слово «хеш» в качестве корня, что не очень приятно смотреть.

7 голосов
/ 25 ноября 2010

Относительно ответа @rwilliams aka r-dub:

ActiveSupport переместил свои компоненты в отдельные модули для детализации. Вместо того, чтобы загружать все сразу, мы можем сказать ему загружать только определенные подмножества, или, если мы все еще выбираем, мы можем загрузить все сразу. В любом случае, мы не можем использовать require 'activesupport', как раньше, вместо этого мы должны использовать require 'activesupport/all' или одно из подмножеств.

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

Кроме того, ActiveSupport содержит поддержку JSON, поэтому вы можете выполнить полное преобразование с помощью 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"

Первая строка загружается в преобразованиях XML и JSON. Вторая строка устанавливает образец JSON, который будет использоваться для тестирования. Третья строка принимает вид JSON, декодирует его, а затем преобразует в XML.

2 голосов
/ 14 января 2015

Другие ответы не допускают простых рекурсивных преобразований. Как объяснено в этом ответе о Code Review , вам понадобится специальный помощник для создания простого формата, который вы ищете.

Это превратит это ...

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

... в это:

<?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>
0 голосов
/ 25 ноября 2010

Я не знаю магический камень, чтобы сделать это, но то, что вы можете легко сделать, это xml для хеширования и hash для json.

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

затем

require 'json'
my_json = my_hash.to_json
...