0

私は 1 つのアプリのバックエンドを作成していますが、フロントエンドの開発者camelCaseは、受信する JSON ファイルで小文字表記を使用するように強制しました (原文のまま!)。Jbuilder私が使用していて、そのような可能性を提供するオプションがあるので、彼を送ることは問題ありません. しかし、彼の応答を簡単な方法で解析するにはどうすればよいでしょうか? ActiveSupport String#underscoreメソッドを使用してすべてのキーを書き換える代わりに、自動的に作成するオプションはありますか?

例:
JSON でリクエストを取得します。

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

Rails ランドでは、次のように使用します。

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

1 に答える 1

2

ここでいくつかのコードを見つけたので、簡単にコピーできるようにもう一度投稿します。

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"}]

それがあなたの要件を満たすことを願っています。

于 2013-02-19T13:43:31.303 に答える