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?


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:


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

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.


15

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

JSON.parse(string)

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.


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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.