วิธีแปลง JSON เป็น Ruby hash


139

ฉันมีวัตถุ JSON ที่มีค่าต่อไปนี้:

@value = {"val":"test","val1":"test1","val2":"test2"}

ฉันต้องการวนซ้ำใน Ruby เพื่อรับคู่คีย์ / ค่า เมื่อฉันใช้@eachมันจะไม่วนซ้ำผ่านวัตถุเพราะมันไม่ได้อยู่ในรูปแบบ Ruby hash:

@value = {"val"=>"test","val1"=>"test1","val2"=>"test2"}

ฉันจะแปลงออบเจ็กต์ JSON ด้านบนเป็นแฮช Ruby ได้อย่างไร

คำตอบ:


259

ข้อมูลโค้ดต่อไปนี้เป็นอย่างไร

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}

7
value = '{"val":"test","val1":"test1","val2":"test2"}'สามารถอ่านได้มากขึ้น
luckykrrish

42

คุณยังสามารถใช้with_indifferent_accessวิธีการของ Rails เพื่อให้คุณสามารถเข้าถึงเนื้อหาด้วยสัญลักษณ์หรือสตริง

value = '{"val":"test","val1":"test1","val2":"test2"}'
json = JSON.parse(value).with_indifferent_access

แล้ว

json[:val] #=> "test"

json["val"] #=> "test"

ไม่มีใครรู้ว่าสิ่งนี้ใช้ทรัพยากรมากขึ้นสำหรับวัตถุแฮชขนาดใหญ่หรือไม่? ฉันเพิ่งเริ่มใช้ Ruby / Rails แต่สมมติว่าคู่คีย์ - ค่านี้ซ้ำกัน
Jonathan

โอ้พระเจ้านี่เป็นเครื่องช่วยชีวิตหลังจาก 2 ชั่วโมงในการมองหาวิธีแก้ปัญหา "ง่ายๆ" ขอบคุณ!!
tidelake

4

สมมติว่าคุณมีแฮช JSON แขวนอยู่ที่ไหนสักแห่งหากต้องการแปลงเป็นเวอร์ชันของ WarHog โดยอัตโนมัติให้รวมเนื้อหาแฮช JSON ของคุณไว้ใน%q{hsh}แท็ก

ดูเหมือนว่าจะเพิ่มข้อความ Escape ที่จำเป็นทั้งหมดโดยอัตโนมัติเช่นในคำตอบของ WarHog


4

คุณได้ลอง: http://flori.github.com/json/ ?

หากไม่สำเร็จคุณสามารถแยกวิเคราะห์ได้หรือไม่? หากเป็นเพียงอาร์เรย์ที่คุณสนใจสิ่งที่ต้องแยกด้านบนออกจะค่อนข้างง่าย


3

ฉันแปลกใจที่ไม่มีใครชี้ให้เห็น[]วิธีการของ JSON ซึ่งทำให้การถอดรหัสและเข้ารหัสจาก / เป็น JSON เป็นเรื่องง่ายและโปร่งใส

ถ้าออบเจ็กต์มีลักษณะเหมือนสตริงให้แยกวิเคราะห์สตริงและส่งคืนผลลัพธ์ที่แยกวิเคราะห์เป็นโครงสร้างข้อมูล Ruby มิฉะนั้นให้สร้างข้อความ JSON จากออบเจ็กต์โครงสร้างข้อมูล Ruby และส่งคืน

พิจารณาสิ่งนี้:

require 'json'

hash = {"val":"test","val1":"test1","val2":"test2"} # => {:val=>"test", :val1=>"test1", :val2=>"test2"}
str = JSON[hash] # => "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"

strhashในขณะนี้มีการเข้ารหัส JSON

ย้อนกลับได้ง่ายโดยใช้:

JSON[str] # => {"val"=>"test", "val1"=>"test1", "val2"=>"test2"}

ออบเจ็กต์ที่กำหนดเองจำเป็นต้องto_sกำหนดไว้สำหรับคลาสและภายในนั้นจะแปลงอ็อบเจ็กต์เป็นแฮชจากนั้นใช้to_jsonกับมัน


0

คุณสามารถใช้อัญมณี nice_hash: https://github.com/MarioRuiz/nice_hash

require 'nice_hash'
my_string = '{"val":"test","val1":"test1","val2":"test2"}'

# on my_hash will have the json as a hash, even when nested with arrays
my_hash = my_string.json

# you can filter and get what you want even when nested with arrays
vals = my_string.json(:val1, :val2)

# even you can access the keys like this:
puts my_hash._val1
puts my_hash.val1
puts my_hash[:val1]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.