Разбор строки 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'в своем коде.
Жестянщик

Ответы:


560

Это выглядит как 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' }"не является.
Зигги

7
@LinusAn, потому что JSON требует двойных кавычек вокруг строк. См. Строку в определении JSON ( json.org ): «Строка - это последовательность из нуля или более символов Юникода, заключенная в двойные кавычки с использованием обратной косой черты».
endorama

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 вам не нужно устанавливать какие-либо Gems для анализа 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, поэтому установка gem отсутствует.

Я использую версии 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)
Джастин Омс



0

Я создал один гем FastJsonparser, который быстрее, чем JSON.parse и Oj gem, попробуйте

Github: https://github.com/anilmaurya/fast_jsonparser


Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными в случае изменения связанной страницы. - Из Обзора
YSF
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.