Saya bertanya-tanya apa cara terbaik untuk mengonversi pasangan nilai kunci berformat json menjadi hash ruby dengan simbol sebagai kunci: contoh:
{ 'user': { 'name': 'foo', 'age': 40, 'location': { 'city' : 'bar', 'state': 'ca' } } }
==>
{ :user=>{ :name => 'foo', :age =>'40', :location=>{ :city => 'bar', :state=>'ca' } } }
Apakah ada metode pembantu yang bisa melakukan ini?
ruby-on-rails
ruby
json
ez.
sumber
sumber
http://stackoverflow.com/a/43773159/1297435
untuk rel 4.1Jawaban:
menggunakan permata json saat mem-parsing string json Anda dapat meneruskan opsi symbolize_names. Lihat di sini: http://flori.github.com/json/doc/index.html (lihat di bawah parse)
misalnya:
sumber
:symbolize_keys
? kenapa nama itu berubah?symbolize_keys
adalah hal Rails.Leventix, terima kasih atas jawaban Anda.
Metode Marshal.load (Marshal.dump (h)) mungkin memiliki integritas paling tinggi dari berbagai metode karena metode ini mempertahankan jenis kunci asli secara rekursif .
Ini penting jika Anda memiliki hash bersarang dengan campuran string dan kunci simbol dan Anda ingin mempertahankan campuran tersebut setelah dekode (misalnya, ini bisa terjadi jika hash Anda berisi objek khusus Anda sendiri selain sepertiga yang sangat kompleks / bersarang) objek -party yang kuncinya tidak dapat Anda manipulasi / konversi karena alasan apa pun, seperti batasan waktu proyek).
Misalnya:
Metode 1 : JSON.parse - melambangkan semua kunci secara rekursif => Tidak menyimpan campuran asli
Metode 2 : ActiveSupport :: JSON.decode - hanya melambangkan kunci tingkat atas => Tidak menyimpan campuran asli
Metode 3 : Marshal.load - mempertahankan campuran string / simbol asli dalam kunci bersarang. SEMPURNA!
Kecuali jika ada kelemahan yang tidak saya sadari, saya akan berpikir Metode 3 adalah cara yang tepat.
Bersulang
sumber
Tidak ada bawaan untuk melakukan trik ini, tetapi tidak terlalu sulit untuk menulis kode untuk melakukannya menggunakan permata JSON. Ada sebuah
symbolize_keys
metode yang dibangun ke dalam Rails jika Anda menggunakannya, tetapi itu tidak melambangkan kunci secara rekursif seperti yang Anda butuhkan.Seperti yang dikatakan Leventix, permata JSON hanya menangani string yang dikutip ganda (yang secara teknis benar - JSON harus diformat dengan tanda kutip ganda). Sedikit kode ini akan membersihkannya sebelum mencoba menguraikannya.
sumber
Metode rekursif:
sumber
Tentu saja, ada permata json , tapi itu hanya menangani tanda kutip ganda.
sumber
JSON.parse(JSON.generate([:a])) # => ["a"]
Marshal.load(Marshal.dump([:a]))
sebagai gantinya.Cara lain untuk menanganinya adalah dengan menggunakan serialisasi / deserialisasi YAML, yang juga mempertahankan format kunci:
Manfaat dari pendekatan ini, sepertinya format yang lebih cocok untuk layanan REST ...
sumber
YAML.load
dimaksudkan untuk menserialisasikan objek sewenang-wenang (misalnya untuk cache). UsulanYAML.safe_load
telah diperkenalkan beberapa bulan setelah posting blog itu, jadi masalah menggunakan hal yang benar: github.com/ruby/psych/commit/…Cara yang paling nyaman adalah dengan menggunakan permata nice_hash: https://github.com/MarioRuiz/nice_hash
sumber