如何在Ruby中将JSON转换为XML?

时间:2010-11-24 23:11:57

标签: ruby xml json activesupport

有没有办法在Ruby中将JSON转换为XML?

4 个答案:

答案 0 :(得分:11)

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的根参数。如果你没有指定一个root,那么它将使用'hash'这个词作为root,这看起来不是很好。

答案 1 :(得分:7)

关于@rwilliams又名r-dub回答:

ActiveSupport moved its components到单独的模块中以获得粒度。我们可以告诉它只加载某些子集,或者,如果我们仍然选择,我们可以一次加载所有内容,而不是一次性加载所有内容。无论如何,我们都不能像以前那样使用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 :(得分:1)

其他答案不允许简单的递归转换。正如this answer on 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>

答案 3 :(得分:-1)

我不知道这是一个神奇的宝石,但你可以轻松做的是xml哈希并散列到json。

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

然后

require 'json'
my_json = my_hash.to_json