Розбір струни JSON в Ruby


359

У мене є рядок, який я хочу розібрати в Ruby:

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

Чи є простий спосіб отримати дані?


22
JSON безпосередньо підтримується в Ruby, і з тих пір, як мінімум, Ruby v1.9.3, тому немає необхідності встановлювати дорогоцінний камінь, якщо ви не використовуєте щось старе. Просто використовуйте require 'json'у своєму коді.
Олов'яний чоловік

Відповіді:


559

Це виглядає як JavaScript Object Notation (JSON) . Ви можете проаналізувати JSON, який знаходиться в якійсь змінній, наприклад json_string, так:

require 'json'
JSON.parse(json_string)

Якщо ви використовуєте більш старий Ruby, можливо, вам доведеться встановити дорогоцінний камінь json .


Існують також інші реалізації JSON для Ruby, які можуть краще відповідати деяким випадкам використання:


32
Також ви можете встановити параметр symbolize_names в true, щоб отримати ключі як символи. Приклад:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Нандо Суса

31
JSON безпосередньо підтримується в Ruby, і з тих пір, як мінімум, Ruby v1.9.3, тому немає необхідності встановлювати дорогоцінний камінь, якщо ви не використовуєте щось старе. Просто використовуйте require 'json'у своєму коді.
Олов'яний чоловік

212

Просто, щоб трохи розширити відповіді, що робити з розібраним об’єктом:

# 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

дуже красиво пояснено.
berto77

7
Важлива примітка: '{ "a": "bob" }'дійсна. "{ 'a': 'bob' }"не.
Ziggy

7
@LinusAn, оскільки JSON вимагає подвійних лапок навколо рядків. Див. Рядок у визначенні JSON ( json.org ): "Рядок - це послідовність нульових чи більше символів Unicode, загорнута у подвійні лапки, використовуючи зворотні риски".
ендорама

1
У багатьох випадках ви хочете загорнутись JSON.parseв рятувальний блок для JSON::ParserError.
johnml

JSON.parse("[#{value}]")[0]щоб уникнути помилкиA JSON text must at least contain two octets!
Rivenfall

39

Оскільки в Ruby v1.9.3 вам не потрібно встановлювати жодні дорогоцінні камені для розбору JSON, просто використовуйте require 'json':

require 'json'

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

Дивіться JSON на Ruby-Doc.


15

Це схоже на рядок JSON. Ви можете використовувати одну з багатьох бібліотек JSON, і це так само просто, як робити:

JSON.parse(string)

7

Це трохи пізно, але я зіткнувся з чимось цікавим, що здається важливим, щоб зробити свій внесок.

Я випадково написав цей код, і він, здається, працює:

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

Я був здивований, побачивши, що це працює, оскільки я використовую бібліотеку YAML, але вона працює.

Причина, чому це важливо, полягає в тому, що yamlвона вбудована разом з Ruby, щоб не встановити дорогоцінний камінь.

Я використовую версії 1.8.x та 1.9.x - тому jsonбібліотека не вбудована, але вона є у версії 2.x.

Тож технічно - це найпростіший спосіб вилучення даних у версії нижче 2.0.


Так, JSON насправді аналізується кодом Psych, який також розбирає YAML в Ruby. І JSON розбір був введений в Ruby v1.9.3 .
Олов'яний чоловік

1
Причина цього працює в тому, що семантично (більшість) JSON є дійсним YAML (особливо YAML 1.2)
Джастін Омс


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.