Мне интересно, как лучше всего преобразовать пару значений ключа в формате json в рубиновый хеш с символом в качестве ключа: пример:
{ 'user': { 'name': 'foo', 'age': 40, 'location': { 'city' : 'bar', 'state': 'ca' } } }
==>
{ :user=>{ :name => 'foo', :age =>'40', :location=>{ :city => 'bar', :state=>'ca' } } }
Есть ли вспомогательный метод, который может это сделать?
http://stackoverflow.com/a/43773159/1297435
для rails 4.1Ответы:
используя гем json при разборе строки json, вы можете передать параметр symbolize_names. См. Здесь: http://flori.github.com/json/doc/index.html (смотрите под синтаксическим анализом)
например:
источник
:symbolize_keys
? почему это имя изменилось?symbolize_keys
это вещь из Rails.Левентикс, спасибо за ответ.
Метод Marshal.load (Marshal.dump (h)), вероятно, имеет наибольшую целостность среди различных методов, поскольку он рекурсивно сохраняет исходные типы ключей .
Это важно, если у вас есть вложенный хэш со смесью строковых и символьных ключей, и вы хотите сохранить это сочетание при декодировании (например, это может произойти, если ваш хеш содержит ваши собственные пользовательские объекты в дополнение к очень сложным / вложенным третьим -party объекты, ключи которых вы не можете манипулировать / преобразовывать по какой-либо причине, например временные ограничения проекта).
Например:
Метод 1 : JSON.parse - рекурсивно символизирует все ключи => Не сохраняет исходный микс
Метод 2 : ActiveSupport :: JSON.decode - символизирует только ключи верхнего уровня => Не сохраняет исходный микс
Метод 3 : Marshal.load - сохраняет исходное сочетание строки / символа во вложенных ключах. ИДЕАЛЬНЫЙ!
Если нет недостатка, о котором я не знаю, я бы подумал, что метод 3 - это правильный путь.
Ура
источник
Нет ничего встроенного, чтобы сделать это, но написать код для этого с использованием драгоценного камня JSON не так уж сложно. В
symbolize_keys
Rails есть метод, если вы его используете, но он не символизирует ключи рекурсивно, как вам нужно.Как сказал Левентикс, гем JSON обрабатывает только строки с двойными кавычками (что технически правильно - JSON должен быть отформатирован с двойными кавычками). Этот фрагмент кода очистит это, прежде чем пытаться его проанализировать.
источник
Рекурсивный метод:
источник
Конечно, есть гем json , но он обрабатывает только двойные кавычки.
источник
JSON.parse(JSON.generate([:a])) # => ["a"]
Marshal.load(Marshal.dump([:a]))
вместо.Другой способ справиться с этим - использовать сериализацию / десериализацию YAML, которая также сохраняет формат ключа:
Преимущество этого подхода кажется, что формат лучше подходит для служб REST ...
источник
YAML.load
предназначен для сериализации произвольных объектов (например, для кеша). ПредлагаемоеYAML.safe_load
было представлено через несколько месяцев после этого сообщения в блоге, так что это вопрос правильного использования: github.com/ruby/psych/commit/…Самый удобный способ - использовать гем nice_hash: https://github.com/MarioRuiz/nice_hash
источник