Parsing string JSON di Ruby

359

Saya memiliki string yang ingin saya uraikan di Ruby:

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

Apakah ada cara mudah untuk mengekstrak data?

tongkat
sumber
22
JSON secara langsung didukung di Ruby, dan telah setidaknya sejak Ruby v1.9.3, jadi tidak perlu menginstal permata kecuali Anda menggunakan sesuatu yang lebih tua. Cukup gunakan require 'json'dalam kode Anda.
the Tin Man

Jawaban:

560

Ini terlihat seperti JavaScript Object Notation (JSON) . Anda dapat menguraikan JSON yang berada di beberapa variabel, misalnya json_string, seperti:

require 'json'
JSON.parse(json_string)

Jika Anda menggunakan Ruby yang lebih lama, Anda mungkin perlu menginstal json gem .


Ada juga implementasi JSON untuk Ruby yang mungkin cocok dengan beberapa kasus penggunaan yang lebih baik:

Greg
sumber
32
Anda juga dapat menetapkan opsi symbolize_names menjadi true, untuk mendapatkan kunci sebagai simbol. Contoh:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa
31
JSON secara langsung didukung di Ruby, dan telah setidaknya sejak Ruby v1.9.3, jadi tidak perlu menginstal permata kecuali Anda menggunakan sesuatu yang lebih tua. Cukup gunakan require 'json'dalam kode Anda.
the Tin Man
212

Hanya untuk sedikit memperluas jawaban dengan apa yang harus dilakukan dengan objek yang diuraikan:

# 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
raja nevan
sumber
dijelaskan dengan sangat baik.
berto77
7
Catatan penting: '{ "a": "bob" }'valid. "{ 'a': 'bob' }"tidak.
Ziggy
7
@LinusAn karena JSON membutuhkan tanda kutip ganda di sekitar string. Lihat string dalam definisi JSON ( json.org ): "Sebuah string adalah urutan dari nol atau lebih karakter Unicode, dibungkus dengan tanda kutip ganda, menggunakan backslash escapes."
endorama
1
Dalam banyak kasus Anda ingin membungkus JSON.parsedalam blok penyelamatan JSON::ParserError.
johnml
JSON.parse("[#{value}]")[0]untuk menghindari kesalahanA JSON text must at least contain two octets!
Rivenfall
39

Pada Ruby v1.9.3 Anda tidak perlu menginstal Permata apa pun untuk mem-parse JSON, cukup gunakan require 'json':

require 'json'

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

Lihat JSON di Ruby-Doc.

dav_i
sumber
15

Sepertinya string JSON. Anda dapat menggunakan salah satu dari banyak perpustakaan JSON dan itu sesederhana melakukan:

JSON.parse(string)
keymone
sumber
7

Ini agak terlambat tetapi saya menemukan sesuatu yang menarik yang tampaknya penting untuk disumbangkan.

Saya tidak sengaja menulis kode ini, dan sepertinya berhasil:

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

Saya terkejut melihatnya berfungsi karena saya menggunakan perpustakaan YAML, tetapi berhasil.

Alasan mengapa hal ini penting adalah karena sudah yamlada bawaan dengan Ruby sehingga tidak ada pemasangan permata.

Saya menggunakan versi 1.8.x dan 1.9.x - jadi jsonpustaka tidak dibangun, tetapi dalam versi 2.x.

Jadi secara teknis - ini adalah cara termudah untuk mengekstrak data dalam versi yang lebih rendah dari 2.0.

orang mograbi
sumber
Ya, JSON sebenarnya diuraikan oleh kode Psych, yang juga mem-parsing YAML di Ruby. Dan parsing JSON diperkenalkan di Ruby v1.9.3 .
the Tin Man
1
Alasannya adalah karena JSON yang semantik (sebagian besar) adalah valid YAML (terutama YAML 1.2)
Justin Ohms
4

Data itu terlihat seperti itu dalam format JSON.

Anda bisa menggunakan implementasi JSON ini untuk Ruby untuk mengekstraknya.

Justin Ethier
sumber