10

RubyでJSONをXMLに変換する方法はありますか?

4

4 に答える 4

12
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のルート引数にも注意してください。ルートを指定しない場合は、ルートとして「ハッシュ」という単語が使用されますが、見た目はあまり良くありません。

于 2010-11-24T23:25:29.447 に答える
8

@rwilliams別名r-dub回答について:

ActiveSupportは、粒度を高めるためにコンポーネントを個別のモジュールに移動しました。すべてを一度にロードするのではなく、特定のサブセットのみをロードするように指示できます。それでも選択した場合は、すべてを一度にロードできます。何があっても、require 'activesupport'以前のように使用することはできません。代わりに、require 'activesupport/all'またはサブセットの1つを使用する必要があります。

>> 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変換で読み込まれます。2行目は、テストに使用するJSONサンプルを設定します。3行目は、JSONのふりをしてデコードし、XMLに変換します。

于 2010-11-25T02:41:57.150 に答える
2

他の答えは、単純な再帰的変換を許可していません。コードレビューに関するこの回答で説明されているように、探している単純な形式を作成するには、カスタムヘルパーが必要です。

これを回します...

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>
于 2015-01-14T18:45:38.870 に答える
-1

私はそれを行うための魔法の宝石を知りませんが、あなたが簡単にできることは、ハッシュするxmlとjsonにハッシュすることです。

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

それから

require 'json'
my_json = my_hash.to_json
于 2010-11-24T23:20:43.997 に答える