วิธีการแปลงวัตถุแฮช ruby ​​เป็น JSON?


340

วิธีการแปลงวัตถุแฮช ruby ​​เป็น JSON? ดังนั้นฉันลองตัวอย่างด้านล่างนี้แล้วมันใช้ไม่ได้

ฉันดู RubyDoc และเห็นได้ชัดว่าHashวัตถุไม่มีto_jsonวิธี แต่ฉันกำลังอ่านบนบล็อกที่ Rails สนับสนุนactive_record.to_jsonและสนับสนุนhash#to_jsonด้วย ฉันสามารถเข้าใจได้ว่าActiveRecordเป็นวัตถุ Rails แต่Hashไม่ได้เป็นของ Rails มันเป็นวัตถุ Ruby บริสุทธิ์ ดังนั้นใน Rails คุณสามารถทำได้hash.to_jsonแต่ไม่ใช่ Ruby ที่บริสุทธิ์หรือ

car = {:make => "bmw", :year => "2003"}
car.to_json

คำตอบ:


563

หนึ่งในหลาย ๆ สิ่งของ Ruby คือความเป็นไปได้ที่จะขยายคลาสที่มีอยู่ด้วยวิธีการของคุณเอง ที่เรียกว่า "การเปิดชั้นเรียนใหม่" หรือการปะแก้ลิง (ความหมายของคำหลังอาจแตกต่างกันไป )

ดังนั้นลองดูที่นี่:

car = {:make => "bmw", :year => "2003"}
# => {:make=>"bmw", :year=>"2003"}
car.to_json
# NoMethodError: undefined method `to_json' for {:make=>"bmw", :year=>"2003"}:Hash
#   from (irb):11
#   from /usr/bin/irb:12:in `<main>'
require 'json'
# => true
car.to_json
# => "{"make":"bmw","year":"2003"}"

ที่คุณสามารถดูต้องjsonได้นำวิธีการที่น่าอัศจรรย์ของเราto_jsonHash


2
ทั้งหมดที่ฉันสามารถพูดได้คือว้าว :) ขอบคุณมาก !! ดังนั้นโดยทั่วไปฉันสามารถขยายคลาส json แบบไดนามิกได้หรือไม่?
kapso

1
ฉันลองสิ่งเดียวกันกับวัตถุ Ruby และมันใช้งานไม่ได้ ??? >> ต้องการ 'json' => จริง >> คลาสบุคคล >> attr_accessor: fname,: lname >> end => nil >> p = Person.new => # <บุคคล: 0x101155f70> >> p.fname = "Bill "=>" Bill ">> p.lname =" Shine "=>" Shine ">> p.to_json =>" \ "# <คน: 0x101155f70> \" "
kapso

10
ไม่ไม่ต้องมีใครคนหนึ่งต้องเขียนรหัสว่าวัตถุของคลาสโดยพลการควรต่อเนื่องเป็น JSON พวกเขาทำมันHashและArrayชั้นเรียนในjsonอัญมณี แต่ชั้นเรียนของคุณเป็นเพียงธรรมดาPerson Objectแต่คุณสามารถรับช่วงHashแทน คุณสามารถเปิดคำถามใหม่ได้หากคุณไม่จัดการ
Mladen Jablanović

ขอบคุณ นี่คือคำถามใหม่ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม ขอบคุณ stackoverflow.com/questions/3226054/…
kapso

คุณกำลังแสดงสิ่งที่ดูเหมือนจะเป็นเอาท์พุทประเภท IRB ฉันพยายามแฮช # to_json ให้ทำงานกับวัตถุ DateTime ขอบคุณโพสต์นี้ฉันได้รับมัน แต่ฉันตรวจสอบด้วย p date_json นี่คือสิ่งที่ฉันได้รับจากสตริงที่แท้จริง "{\" ปี \ ": 2013, \" mon \ ": 7, \" mday \ ": 16, \" ชั่วโมง \ ": 13, \ "min \": 54, \ "sec \": 32, \ "zone \": \ "- 05:00 \", \ "offset \": - 18000} "ดังนั้นคุณอาจเห็นว่ามันกำลังทำให้ สัญลักษณ์สำคัญเป็นสตริงและแน่นอนว่าข้อมูลไม่เปลี่ยนแปลง ขอบคุณอีกครั้ง. ขอโทษที่มาช้า
Douglas G. Allen


6

คุณยังสามารถใช้JSON.generate:

require 'json'

JSON.generate({ foo: "bar" })
=> "{\"foo\":\"bar\"}"

หรือนามแฝงJSON.unparse:

require 'json'

JSON.unparse({ foo: "bar" })
=> "{\"foo\":\"bar\"}"

3

เพิ่มบรรทัดต่อไปนี้ที่ด้านบนของไฟล์ของคุณ

require 'json'

จากนั้นคุณสามารถใช้:

car = {:make => "bmw", :year => "2003"}
car.to_json

หรือคุณสามารถใช้:

JSON.generate({:make => "bmw", :year => "2003"})

-1

คุณควรรวมjsonไว้ในไฟล์ของคุณ

ตัวอย่างเช่น,

require 'json'

your_hash = {one: "1", two: "2"}
your_hash.to_json

สำหรับความรู้เพิ่มเติมเกี่ยวกับjsonคุณสามารถเยี่ยมชมลิงค์ด้านล่าง การเรียนรู้ Json

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.