การแยกสตริง JSON ใน Ruby


359

ฉันมีสตริงที่ฉันต้องการแยกในทับทิม:

string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'

มีวิธีที่ง่ายในการดึงข้อมูลหรือไม่


22
JSON ได้รับการสนับสนุนโดยตรงใน Ruby และตั้งแต่ Ruby v1.9.3 เป็นอย่างน้อยดังนั้นจึงไม่จำเป็นต้องติดตั้ง gem จนกว่าคุณจะใช้บางอย่างที่เก่ากว่า เพียงใช้require 'json'ในรหัสของคุณ
ชายดีบุก

คำตอบ:


559

ลักษณะเช่นนี้Object สัญลักษณ์ JavaScript (JSON) คุณสามารถวิเคราะห์ JSON ที่อยู่ในตัวแปรเช่นjson_stringเช่น:

require 'json'
JSON.parse(json_string)

หากคุณกำลังใช้เก่าทับทิมคุณอาจต้องติดตั้งอัญมณี JSON


นอกจากนี้ยังมีการใช้งานอื่น ๆ ของ JSON สำหรับ Ruby ที่อาจเหมาะสมกับบางกรณีการใช้งานที่ดีกว่า:


32
นอกจากนี้คุณสามารถตั้งค่าตัวเลือก symbolize_names เป็นจริงเพื่อรับคีย์เป็นสัญลักษณ์ ตัวอย่าง:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa

31
JSON ได้รับการสนับสนุนโดยตรงใน Ruby และตั้งแต่ Ruby v1.9.3 เป็นอย่างน้อยดังนั้นจึงไม่จำเป็นต้องติดตั้ง gem จนกว่าคุณจะใช้บางอย่างที่เก่ากว่า เพียงใช้require 'json'ในรหัสของคุณ
ชายดีบุก

212

เพียงเพื่อขยายคำตอบเล็กน้อยเกี่ยวกับสิ่งที่แยกวิเคราะห์:

# JSON Parsing example
require "rubygems" # don't need this if you're Ruby v1.9.3 or higher
require "json"

string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'
parsed = JSON.parse(string) # returns a hash

p parsed["desc"]["someKey"]
p parsed["main_item"]["stats"]["a"]

# Read JSON from a file, iterate over objects
file = open("shops.json")
json = file.read

parsed = JSON.parse(json)

parsed["shop"].each do |shop|
  p shop["id"]
end

อธิบายอย่างมาก
berto77

7
หมายเหตุสำคัญ: '{ "a": "bob" }'ถูกต้อง "{ 'a': 'bob' }"ไม่ใช่.
Ziggy

7
@LinusAn เนื่องจาก JSON ต้องการเครื่องหมายคำพูดคู่รอบสตริง ดูสตริงในคำจำกัดความ JSON ( json.org ): "สตริงเป็นลำดับของอักขระ Unicode ที่เป็นศูนย์หรือมากกว่านั้นอยู่ในเครื่องหมายคำพูดคู่โดยใช้เครื่องหมายแบคสแลช"
endorama

1
ในหลายกรณีคุณต้องการที่จะห่อภายในบล็อกกู้ภัยJSON.parse JSON::ParserError
johnml

JSON.parse("[#{value}]")[0]เพื่อหลีกเลี่ยงข้อผิดพลาดA JSON text must at least contain two octets!
Rivenfall

39

ในฐานะของ Ruby v1.9.3 คุณไม่จำเป็นต้องติดตั้งอัญมณีใด ๆ เพื่อแยก JSON ให้ใช้require 'json':

require 'json'

json = JSON.parse '{"foo":"bar", "ping":"pong"}'
puts json['foo'] # prints "bar"

ดูJSONที่ Ruby-Doc


15

ดูเหมือนว่าเป็นสตริง JSON คุณสามารถใช้หนึ่งในหลาย ๆ JSON ไลบรารีและมันง่ายเหมือนการทำ:

JSON.parse(string)

7

มันช้าไปหน่อย แต่ฉันวิ่งเข้าไปในสิ่งที่น่าสนใจซึ่งดูเหมือนจะสำคัญสำหรับการมีส่วนร่วม

ฉันบังเอิญเขียนรหัสนี้และดูเหมือนว่าจะทำงาน:

require 'yaml'
CONFIG_FILE = ENV['CONFIG_FILE'] # path to a JSON config file 
configs = YAML.load_file("#{CONFIG_FILE}")
puts configs['desc']['someKey']

ฉันแปลกใจที่เห็นว่ามันใช้งานได้ตั้งแต่ฉันใช้ห้องสมุด YAML แต่มันใช้งานได้

เหตุผลที่สำคัญคือyamlมาพร้อมกับ Ruby ในตัวจึงไม่มีการติดตั้งอัญมณี

ฉันใช้รุ่น 1.8.x และ 1.9.x - ดังนั้นjsonไลบรารีไม่ได้ถูกสร้างขึ้น แต่เป็นรุ่น 2.x

ดังนั้นทางเทคนิค - นี่เป็นวิธีที่ง่ายที่สุดในการดึงข้อมูลในรุ่นที่ต่ำกว่า 2.0


ใช่ JSON ถูกวิเคราะห์โดยรหัส Psych ซึ่งแยกวิเคราะห์ YAML ใน Ruby และ JSON แยกเป็นที่รู้จักในทับทิม v1.9.3
ชายดีบุก

1
เหตุผลที่ทำงานนี้คือ semantically (ส่วนใหญ่) JSON ถูกต้อง YAML (โดยเฉพาะ YAML 1.2)
Justin Ohms


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