Phân tích chuỗi JSON trong Ruby


359

Tôi có một chuỗi mà tôi muốn phân tích trong Ruby:

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

Có một cách dễ dàng để trích xuất dữ liệu?


22
JSON được hỗ trợ trực tiếp trong Ruby và đã có từ ít nhất là Ruby v1.9.3, do đó không cần phải cài đặt đá quý trừ khi bạn đang sử dụng thứ gì đó cũ hơn. Đơn giản chỉ cần sử dụng require 'json'trong mã của bạn.
Tin Man

Câu trả lời:


559

Điều này trông giống như ký hiệu đối tượng JavaScript (JSON) . Bạn có thể phân tích cú pháp JSON nằm trong một số biến, ví dụ json_stringnhư vậy:

require 'json'
JSON.parse(json_string)

Nếu bạn đang sử dụng Ruby cũ hơn, bạn có thể cần cài đặt đá quý json .


Ngoài ra còn có các triển khai JSON cho Ruby khác có thể phù hợp với một số trường hợp sử dụng hơn:


32
Ngoài ra, bạn có thể đặt tùy chọn Symbolize_names thành true, để lấy khóa làm biểu tượng. Ví dụ:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa

31
JSON được hỗ trợ trực tiếp trong Ruby và đã có từ ít nhất là Ruby v1.9.3, do đó không cần phải cài đặt đá quý trừ khi bạn đang sử dụng thứ gì đó cũ hơn. Đơn giản chỉ cần sử dụng require 'json'trong mã của bạn.
Tin Man

212

Chỉ cần mở rộng câu trả lời một chút với những gì cần làm với đối tượng được phân tích cú pháp:

# 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

giải thích rất độc đáo.
berto77

7
Lưu ý quan trọng: '{ "a": "bob" }'là hợp lệ. "{ 'a': 'bob' }"không phải.
Ziggy

7
@LinusAn vì JSON yêu cầu dấu ngoặc kép quanh chuỗi. Xem chuỗi trong định nghĩa JSON ( json.org ): "Chuỗi là một chuỗi gồm 0 hoặc nhiều ký tự Unicode, được gói trong dấu ngoặc kép, sử dụng các dấu gạch chéo ngược."
endorama

1
Trong nhiều trường hợp bạn muốn bọc JSON.parsetrong một khối cứu hộ cho JSON::ParserError.
johnml

JSON.parse("[#{value}]")[0]để tránh những lỗiA JSON text must at least contain two octets!
Rivenfall

39

Kể từ Ruby v1.9.3, bạn không cần phải cài đặt bất kỳ Viên ngọc nào để phân tích JSON, chỉ cần sử dụng require 'json':

require 'json'

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

Xem JSON tại Ruby-Doc.


15

Nó trông giống như một chuỗi JSON. Bạn có thể sử dụng một trong nhiều thư viện JSON và đơn giản như cách thực hiện:

JSON.parse(string)

7

Điều này hơi muộn nhưng tôi đã gặp phải một điều thú vị có vẻ quan trọng để đóng góp.

Tôi đã vô tình viết mã này và nó dường như hoạt động:

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

Tôi đã rất ngạc nhiên khi thấy nó hoạt động vì tôi đang sử dụng thư viện YAML, nhưng nó hoạt động.

Lý do tại sao điều quan trọng là yamlđược tích hợp sẵn với Ruby để không có cài đặt đá quý.

Tôi đang sử dụng phiên bản 1.8.x và 1.9.x - vì vậy jsonthư viện không được tích hợp, nhưng nó ở phiên bản 2.x.

Về mặt kỹ thuật - đây là cách dễ nhất để trích xuất dữ liệu trong phiên bản thấp hơn 2.0.


Đúng, JSON thực sự được phân tích cú pháp bởi mã Psych, cũng phân tích YAML trong Ruby. Và phân tích cú pháp JSON đã được giới thiệu trong Ruby v1.9.3 .
Tin Man

1
Lý do điều này hoạt động là vì JSON (hầu hết) về mặt ngữ nghĩa là YAML hợp lệ (đặc biệt là YAML 1.2)
Justin Ohms


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.