RubyでJSONをXMLに変換する方法はありますか?
4 に答える
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のルート引数にも注意してください。ルートを指定しない場合は、ルートとして「ハッシュ」という単語が使用されますが、見た目はあまり良くありません。
@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に変換します。
他の答えは、単純な再帰的変換を許可していません。コードレビューに関するこの回答で説明されているように、探している単純な形式を作成するには、カスタムヘルパーが必要です。
これを回します...
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>
私はそれを行うための魔法の宝石を知りませんが、あなたが簡単にできることは、ハッシュするxmlとjsonにハッシュすることです。
require 'active_support'
my_hash = Hash.from_xml(my_xml)
それから
require 'json'
my_json = my_hash.to_json