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

11

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


1
我添加了 activesupport 标签,并将您的标题改成了一个问题。 - the Tin Man
4个回答

13
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”作为根,这看起来不太好。


我需要一些针对 active_support 的 gem 吗?当我尝试 require 它时,出现了一个错误。 - Mark Szymanski
是的。Active Support 是 Ruby on Rails 的一部分。你应该可以通过 'gem install activesupport' 来安装它。 - rwilliams
它对我来说工作得很好。我正在使用json_pure(1.2.0)和active_support(2.3.5)。您使用的是哪些版本? - rwilliams
而且,如果你想继续交流,我会在 Ruby 聊天室里。 - Mark Szymanski
Activesupport不再在您需要时导入所有功能。您必须明确表示要导入所有内容或指定您想要的内容。如果您发现to_xml函数未定义,则可能会遇到此问题。请参见: https://dev59.com/e1DTa4cB1Zd3GeqPHkKh - obesechicken13
显示剩余9条评论

8

关于@rwilliams,也就是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
其他答案无法进行简单的递归转换。正如在 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>

-1

我不知道有什么神奇的宝石可以做到这一点,但你可以很容易地将XML转换为哈希,再将哈希转换为JSON。

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

然后

require 'json'
my_json = my_hash.to_json

4
我正在尝试将 JSON 转换成 XML,而不是将 XML 转换成 JSON。 - Mark Szymanski
那些奇怪的引号会起作用吗?这看起来不太健康。 - jwueller
@elusive:是的,它们对我来说看起来很奇怪。我认为它们是智能引号。 - Mark Szymanski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接