2012-11-22 31 views
1

从这里开始rails程序员。我试图将哈希转换为xml和json,但输出是不同的。to_json和to_xml在rails中给出不同的输出

这里的哈希:

{: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(这是我想要什么)

{"response": {"exchangeRates": [ 
    { 
     "baseCurrency": "USD", 
     "quoteCurrency": "EUR", 
     "amount": 1, 
     "nprices": 1, 
     "conversions": [{ 
      "date": "2012-11-20T21:00:00+00:00", 
      "ask": "0.7813", 
      "bid": "0.7813" 
     }] 
    }, 
    { 
     "baseCurrency": "CAD", 
     "quoteCurrency": "EUR", 
     "amount": 1, 
     "nprices": 1, 
     "conversions": [{ 
      "date": "2012-11-20T21:00:00+00:00", 
      "ask": "0.7839", 
      "bid": "0.7837" 
     }] 
    } 
]}} 

这里是我的XML渲染代码:

format.xml { render :xml => rates.to_hash(), :root => 'response' } 

下面是XML输出(有些情况下,我把阵列额外的标签):

<response> 
    <exchangeRates type="array"> 
     <exchangeRate> 
      <baseCurrency>USD</baseCurrency> 
      <quoteCurrency>EUR</quoteCurrency> 
      <amount type="integer">1</amount> 
      <nprices type="integer">1</nprices> 
      <conversions type="array"> 
       <conversion> 
        <date type="datetime">2012-11-20T21:00:00+00:00</date> 
        <ask>0.7813</ask> 
        <bid>0.7813</bid> 
       </conversion> 
      </conversions> 
     </exchangeRate> 
     <exchangeRate> 
      <baseCurrency>CAD</baseCurrency> 
      <quoteCurrency>EUR</quoteCurrency> 
      <amount type="integer">1</amount> 
      <nprices type="integer">1</nprices> 
      <conversions type="array"> 
       <conversion> 
        <date type="datetime">2012-11-20T21:00:00+00:00</date> 
        <ask>0.7839</ask> 
        <bid>0.7837</bid> 
       </conversion> 
      </conversions> 
     </exchangeRate> 
    </exchangeRates> 
</response> 

正如你所看到的,它是增加额外的“阵列”属性标记,即exchangeRates和转换。我如何得到这个与json相同的格式?我也不希望任何标签上的属性。我知道你可以传入属性,例如:root =>'response',但是在查找了很长一段时间之后,我似乎无法在Web上找到这些属性的列表。

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

回答

1

这是最好直接转到源代码的情况。 to_xml方法位于ActiveModel::Serializer模块中,这里是inline docs,它没有提及有关type="array"属性标记的任何内容。深入挖掘一下,你会发现它们出现在add_associations方法的第130行的同一个文件中。

轨/ activemodel的/ lib目录/ active_model /串行器/ xml.rb:130

type = options[:skip_types] ? { } : {:type => "array"} 

这告诉我们,有一个选项叫skip_types,这似乎无处记录。尝试通过,为to_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" 

你会发现所有添加的type属性都没有了。

所以只是通过相同的选项render,你会得到期望的结果:

format.xml { render :xml => rates.to_hash(), :root => 'response', :skip_types => true } 
+0

更新:测试了这确实也有'render'工作。 –

+0

感谢您的回复。的是,我想完全摆脱该阵列标签,即,用于家庭的例子,我期望的XML将是:<?xml的版本= 1.0> ' '。在查看代码后,我认为这似乎不可能。也许我可以回到设计人员那里,让他们改变输出以包含该包装标签,因为这似乎是生成xml的正确方式。你怎么看? – willard

+0

我明白了。但这不是你问的。你说你想让xml像JSON一样,并且在JSON中有一个名为'“exchangeRates”的关键字,接着是数组。如果你完全取出标签(我看到它的方式),你正在创建与JSON不同的xml。 –

相关问题