Ruby on rails to_json和to_xml在rails中提供不同的输出

Ruby on rails to_json和to_xml在rails中提供不同的输出,ruby-on-rails,ruby,xml,json,activesupport,Ruby On Rails,Ruby,Xml,Json,Activesupport,从这里开始。我试图将哈希转换为xml和json,但输出是不同的 下面是散列: {:exchangeRates=>[{:baseCurrency=>"USD", :quoteCurrency=>"EUR", :amount=>1, :nprices=>1, :conversions=>[{:date=>Tue, 20 Nov 2012 21:00:00 +0000, :ask=>"0.7813", :bid=>"0.7813"}]}, {:ba

从这里开始。我试图将哈希转换为xml和json,但输出是不同的

下面是散列:

{:exchangeRates=>[{:baseCurrency=>"USD", :quoteCurrency=>"EUR", :amount=>1, :nprices=>1, :conversions=>[{:date=>Tue, 20 Nov 2012 21:00:00 +0000, :ask=>"0.7813", :bid=>"0.7813"}]}, {:baseCurrency=>"CAD", :quoteCurrency=>"EUR", :amount=>1, :nprices=>1, :conversions=>[{:date=>Tue, 20 Nov 2012 21:00:00 +0000, :ask=>"0.7839", :bid=>"0.7837"}]}]}
下面是相应的渲染代码

format.json { render :json => { :response => rates.to_hash() } }
这里是JSON(这就是我想要的)

以下是我的xml呈现代码:

format.xml { render :xml => rates.to_hash(), :root => 'response' }
以下是xml输出(我在数组中添加了额外的标记):


美元
欧元
1.
1.
2012-11-20T21:00:00+00:00
0.7813
0.7813
计算机辅助设计
欧元
1.
1.
2012-11-20T21:00:00+00:00
0.7839
0.7837
如您所见,它添加了额外的“array”属性标记,即exchangeRates和conversions。如何使其格式与json相同?我也不想要任何标签上的属性。我知道您可以传入属性,例如:root=>“response”,但在查找了很长一段时间后,我似乎在web上找不到这些属性的列表


任何帮助都将不胜感激,谢谢

在这种情况下,最好直接转到源代码。
to_xml
方法位于
ActiveModel::Serializer
模块中,这里是,它没有提到任何关于
type=“array”
属性标记的内容。再深入一点,你会看到它们出现在一个名为的方法的第130行的同一个文件中

rails/activemodel/lib/active\u model/serializers/xml.rb:130

type = options[:skip_types] ? { } : {:type => "array"}
这告诉我们有一个名为“跳过类型”的选项,它似乎没有任何文档记录。尝试将其传递到
到\u xml
,您将获得所需的行为:

a = [1, 2, 3]
a.to_xml
#=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fixnums type=\"array\">\n  <fixnum type=\"integer\">1</fixnum>\n  <fixnum type=\"integer\">2</fixnum>\n  <fixnum type=\"integer\">3</fixnum>\n</fixnums>\n"
a.to_xml(:skip_types => true)
#=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fixnums>\n  <fixnum>1</fixnum>\n  <fixnum>2</fixnum>\n  <fixnum>3</fixnum>\n</fixnums>\n"

在这种情况下,最好直接转到源代码。
to_xml
方法位于
ActiveModel::Serializer
模块中,这里是,它没有提到任何关于
type=“array”
属性标记的内容。再深入一点,你会看到它们出现在一个名为的方法的第130行的同一个文件中

rails/activemodel/lib/active\u model/serializers/xml.rb:130

type = options[:skip_types] ? { } : {:type => "array"}
这告诉我们有一个名为“跳过类型”的选项,它似乎没有任何文档记录。尝试将其传递到
到\u xml
,您将获得所需的行为:

a = [1, 2, 3]
a.to_xml
#=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fixnums type=\"array\">\n  <fixnum type=\"integer\">1</fixnum>\n  <fixnum type=\"integer\">2</fixnum>\n  <fixnum type=\"integer\">3</fixnum>\n</fixnums>\n"
a.to_xml(:skip_types => true)
#=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fixnums>\n  <fixnum>1</fixnum>\n  <fixnum>2</fixnum>\n  <fixnum>3</fixnum>\n</fixnums>\n"

谢谢你的回复。问题是,我想完全去掉这个数组标记,例如,对于您的示例,我想要的xml是:
123
。在看了代码之后,我认为这似乎是不可能的。也许我可以回到设计器,让他们更改输出以包含包装器标记,因为这似乎是生成xml的正确方法。你觉得怎么样?我明白了。但那不是你真正想要的。您说过希望xml像JSON一样,JSON中有一个名为
“exchangeRates”
的键,后跟数组。如果你把标签全部去掉,那么(在我看来)你正在创建与JSON不同的xml。谢谢你的回复。问题是,我想完全去掉这个数组标记,例如,对于您的示例,我想要的xml是:
123
。在看了代码之后,我认为这似乎是不可能的。也许我可以回到设计器,让他们更改输出以包含包装器标记,因为这似乎是生成xml的正确方法。你觉得怎么样?我明白了。但那不是你真正想要的。您说过希望xml像JSON一样,JSON中有一个名为
“exchangeRates”
的键,后跟数组。如果你把标签全部去掉,那么(在我看来)你就是在创建不同于JSON的xml。
format.xml { render :xml => rates.to_hash(), :root => 'response', :skip_types => true }