Розбір струни 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.