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.