Przetwarzanie ciągu JSON w Ruby


359

Mam ciąg, który chcę przeanalizować w Ruby:

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

Czy istnieje prosty sposób na wyodrębnienie danych?


22
JSON jest bezpośrednio obsługiwany w Ruby i jest obecny przynajmniej od wersji Ruby 1.9.3, więc nie ma potrzeby instalowania klejnotu, chyba że używasz czegoś starszego. Po prostu użyj require 'json'w swoim kodzie.
— Tin Man,

Odpowiedzi:


559

To wygląda jak JavaScript Object Notation (JSON) . Możesz parsować JSON, który znajduje się w jakiejś zmiennej, np. json_stringTak:

require 'json'
JSON.parse(json_string)

Jeśli używasz starszego Ruby, może być konieczne zainstalowanie klejnotu json .


Istnieją również inne implementacje JSON dla Ruby, które mogą lepiej pasować do niektórych przypadków użycia:


32
Możesz także ustawić opcję symbolize_names na true, aby uzyskać klucze jako symbole. Przykład:JSON.parse(string, symbolize_names: true) #=> {key: :value}
— Nando Sousa

31
JSON jest bezpośrednio obsługiwany w Ruby i działa od co najmniej Ruby v1.9.3, więc nie ma potrzeby instalowania klejnotu, chyba że używasz czegoś starszego. Po prostu użyj require 'json'w swoim kodzie.
— Tin Man,

212

Aby rozszerzyć nieco odpowiedzi o to, co zrobić z analizowanym obiektem:

# 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

bardzo ładnie wyjaśnione.
— berto77

7
Ważna uwaga: '{ "a": "bob" }'jest ważna. "{ 'a': 'bob' }"nie jest.
— Ziggy

7
@LinusAn, ponieważ JSON wymaga podwójnych cudzysłowów wokół ciągów. Zobacz ciąg w definicji JSON ( json.org ): „Ciąg jest ciągiem zerowym lub więcej znaków Unicode, zawiniętych w podwójne cudzysłowy, z użyciem znaków odwrotnego ukośnika”.
— endorama,

1
W wielu przypadkach chcesz owinąć JSON.parseblok ratunkowy dla JSON::ParserError.
— johnml

JSON.parse("[#{value}]")[0]aby uniknąć błęduA JSON text must at least contain two octets!
— Rivenfall

39

Począwszy od Ruby v1.9.3, nie trzeba instalować żadnych klejnotów, aby przeanalizować JSON, wystarczy użyć require 'json':

require 'json'

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

Zobacz JSON w Ruby-Doc.


15

Wygląda jak ciąg JSON. Możesz użyć jednej z wielu bibliotek JSON, a to tak proste, jak:

JSON.parse(string)

7

Jest trochę późno, ale wpadłem na coś interesującego, co wydaje się ważne.

Przypadkowo napisałem ten kod i wydaje się on działać:

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

Byłem zaskoczony, widząc, że działa, ponieważ korzystam z biblioteki YAML, ale działa.

Powodem, dla którego jest to ważne, jest to yaml jest wbudowany w Ruby, więc nie ma instalacji klejnotów.

Używam wersji 1.8.xi 1.9.x - więc jsonbiblioteka nie jest wbudowana, ale jest w wersji 2.x.

Więc technicznie - jest to najłatwiejszy sposób na wyodrębnienie danych w wersji niższej niż 2.0.


Tak, JSON jest faktycznie analizowany przez kod Psych, który również analizuje YAML w Ruby. I parsowanie JSON zostało wprowadzone w Ruby v1.9.3 .
— Tin Man,

1
Powodem tego jest to, że semantycznie (większość) JSON jest poprawny YAML (szczególnie YAML 1.2)
— Justin Ohms


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.