Ruby'de JSON dizesini ayrıştırma


360

Ruby'de ayrıştırmak istediğim bir dize var:

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

Verileri çıkarmanın kolay bir yolu var mı?


22
JSON doğrudan Ruby'de desteklenir ve en azından Ruby v1.9.3'ten beri kullanılmaktadır, bu nedenle daha eski bir şey kullanmadığınız sürece bir mücevher yüklemenize gerek yoktur. require 'json'Kodunuzda kullanın .
Tin Man

Yanıtlar:


561

Bu, JavaScript Nesne Gösterimi'ne (JSON) benziyor . Örneğin json_string, aşağıdaki gibi bazı değişkenlerde bulunan JSON'u ayrıştırabilirsiniz :

require 'json'
JSON.parse(json_string)

Eski bir Ruby kullanıyorsanız, json gem'i yüklemeniz gerekebilir .


JSON for Ruby'nin bazı kullanım durumlarına daha iyi uyabilecek başka uygulamaları da vardır:


32
Ayrıca, anahtarları sembol olarak almak için symbolize_names seçeneğini true olarak ayarlayabilirsiniz. Örnek:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa

31
JSON doğrudan Ruby'de desteklenir ve en azından Ruby v1.9.3'ten beri kullanılmaktadır, bu nedenle daha eski bir şey kullanmadığınız sürece bir mücevher yüklemenize gerek yoktur. require 'json'Kodunuzda kullanın .
Tin Man

212

Yanıtları, ayrıştırılan nesne ile ne yapılacağıyla biraz genişletmek için:

# 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

çok güzel açıkladı.
berto77

7
Önemli not: '{ "a": "bob" }'geçerlidir. "{ 'a': 'bob' }"değil.
Ziggy

7
@LinusAn çünkü JSON, dizelerin etrafında çift tırnak gerektirir. JSON tanımındaki dizeye bakın ( json.org ): "Bir dize, ters eğik çizgi kaçışlarını kullanarak çift tırnak içine alınmış sıfır veya daha fazla Unicode karakter dizisidir."
endorama

1
Çoğu durumda JSON.parsebir kurtarma bloğunun içine sarmak istersiniz JSON::ParserError.
johnml

JSON.parse("[#{value}]")[0]önlemek içinA JSON text must at least contain two octets!
Rivenfall

39

Ruby v1.9.3'ten itibaren JSON'i ayrıştırmak için herhangi bir Mücevher yüklemenize gerek yoktur, sadece şunu kullanın require 'json':

require 'json'

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

Bkz JSON Yakut-Doc at.


15

Bir JSON dizesi gibi görünüyor. Birçok JSON kütüphanesinden birini kullanabilirsiniz ve bu işlem yapmak kadar basittir:

JSON.parse(string)

7

Bu biraz geç ama katkıda bulunmak önemli görünen ilginç bir şeyle karşılaştım.

Yanlışlıkla bu kodu yazdım ve işe yarıyor gibi görünüyor:

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

YAML kütüphanesini kullandığımdan beri işe yaradığını görünce şaşırdım, ama işe yarıyor.

Bunun önemli olmasının nedeni yaml, Ruby ile yerleşik olması ve böylece gem yüklemesi olmamasıdır.

Sürüm 1.8.x ve 1.9.x kullanıyorum - bu yüzden jsonkütüphane yerleşik değil, ama sürüm 2.x'te.

Bu yüzden teknik olarak - bu, 2.0'dan daha düşük sürümdeki verileri çıkarmanın en kolay yoludur.


Evet, JSON aslında Ruby'de YAML'yi ayrıştıran Psych kodu tarafından ayrıştırılır. Ve JSON ayrıştırma Ruby v1.9.3'te tanıtıldı .
Tin Man

1
Bunun çalışmasının nedeni, anlamsal olarak (çoğu) JSON'un geçerli YAML (özellikle YAML 1.2) olmasıdır
Justin Ohms


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.