2013-02-19 49 views
0

我正在寫一個應用程序的後端,我的前端開發人員強制我在他正在接收的JSON文件中使用小號camelCase表示法(原文如此!)。發送給他這不是問題,因爲我使用Jbuilder,並且有一個選項可以提供這種可能性。但我怎樣才能以簡單的方式解析他的回答?是否有任何選項可以自動使用ActiveSupportString#underscore方法重寫所有密鑰?在Rails應用程序中解析JSON camelCase

例子:
我get請求使用JSON:

{ 
    'someValue': 324, 
    'someOtherValue': 'trolololololo' 
} 

而在Rails的土地我想按如下方式使用它:

@data = JSON.parse(request.body) 
@some_value = @data['some_value'] # or @data[:some_value] 
+3

當你建立一個API時,你必須規則 – apneadiving 2013-02-19 13:01:16

+1

你會提供一個例子嗎?如果它是像userPermission這樣的類名,我們可以提供幫助。但實際上,這是一個嚴重的反模式。請注意,前端框架的餘燼將使用camelCase在JavaScript土地,但將其轉換爲Rails land中的camelCase。 – 2013-02-19 13:45:56

+0

這不是關於班級名稱。這是關於JSON字段的名稱。我想讓Rails像現在一樣(帶有snake_case)和JS land(與camelCase一樣)。 – Hauleth 2013-02-19 15:15:33

回答

2

我發現了一些代碼here,所以我再次發佈它你這樣很容易複製。

def underscore_key(k) 
    if defined? Rails 
    k.to_s.underscore.to_sym 
    else 
    to_snake_case(k.to_s).to_sym 
    end 
end 

def to_snake_case(string) 
    string.gsub(/::/, '/'). 
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). 
    gsub(/([a-z\d])([A-Z])/,'\1_\2'). 
    tr("-", "_"). 
    downcase 
end 

def convert_hash_keys(value) 
    case value 
    when Array 
     value.map { |v| convert_hash_keys(v) } 
     # or `value.map(&method(:convert_hash_keys))` 
    when Hash 
     Hash[value.map { |k, v| [underscore_key(k), convert_hash_keys(v)] }] 
    else 
     value 
    end 
end 

這裏有一些小測試,以證明功能:

p convert_hash_keys({abc:"x"})   # => {:abc=>"x"} 
p convert_hash_keys({abcDef:"x"})  # => {:abc_def=>"x"} 
p convert_hash_keys({AbcDef:"x"})  # => {:abc_def=>"x"} 
p convert_hash_keys(["abc"])   # => ["abc"] 
p convert_hash_keys([abc:"x"])   # => [{:abc=>"x"}] 
p convert_hash_keys([abcDef:"x"])  # => [{:abc_def=>"x"}] 

我希望能滿足您的要求。

+0

Rabl幫助JSON走出去,但我相信這是解析JSON進來。 – 2013-02-19 13:44:25

+0

我將答案的內容更改爲更好的答案 – SeriousM 2013-02-19 14:14:43