Analisando uma Cadeia de Caracteres JSON em Ruby

359

Eu tenho uma string que eu quero analisar no Ruby:

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

Existe uma maneira fácil de extrair os dados?

Cajado
fonte
22
O JSON é suportado diretamente no Ruby e existe desde pelo menos o Ruby v1.9.3, portanto, não há necessidade de instalar uma gema, a menos que você esteja usando algo mais antigo. Basta usar require 'json'no seu código.
the Tin Man

Respostas:

560

Isso se parece com JavaScript Object Notation (JSON) . Você pode analisar o JSON que reside em alguma variável, por exemplo json_string:

require 'json'
JSON.parse(json_string)

Se você estiver usando um Ruby antigo, pode ser necessário instalar o json gem .


Também há outras implementações do JSON para Ruby que podem se encaixar melhor em alguns casos de uso:

Greg
fonte
32
Também é possível definir a opção symbolize_names como true, a fim de obter as chaves como símbolos. Exemplo:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa
31
O JSON é suportado diretamente no Ruby e existe desde pelo menos o Ruby v1.9.3, portanto, não há necessidade de instalar uma gema, a menos que você esteja usando algo mais antigo. Basta usar require 'json'no seu código.
the Tin Man
212

Apenas para estender um pouco as respostas sobre o que fazer com o objeto analisado:

# 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
rei nevan
fonte
muito bem explicado.
berto77
7
Nota importante: '{ "a": "bob" }'é válido. "{ 'a': 'bob' }"não é.
Ziggy
7
@LinusAn porque JSON requer aspas duplas em torno de strings. Consulte a string na definição JSON ( json.org ): "Uma string é uma sequência de zero ou mais caracteres Unicode, envoltos em aspas duplas, usando escapes de barra invertida".
Endorama
11
Em muitos casos, você deseja agrupar JSON.parsedentro de um bloco de resgate JSON::ParserError.
9788 John Deere
JSON.parse("[#{value}]")[0]para evitar o erroA JSON text must at least contain two octets!
Rivenfall 16/03
39

No Ruby v1.9.3, você não precisa instalar nenhum Gems para analisar o JSON, basta usar require 'json':

require 'json'

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

Veja JSON em Ruby-Doc.

dav_i
fonte
15

Parece uma string JSON. Você pode usar uma das muitas bibliotecas JSON e é tão simples quanto fazer:

JSON.parse(string)
keymone
fonte
7

É um pouco tarde, mas encontrei algo interessante que parece importante para contribuir.

Eu acidentalmente escrevi esse código e parece funcionar:

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

Fiquei surpreso ao ver que funciona, pois estou usando a biblioteca YAML, mas funciona.

A razão pela qual é importante é que ele yamlvem embutido no Ruby, portanto não há instalação de gemas.

Estou usando as versões 1.8.xe 1.9.x - portanto, a jsonbiblioteca não está incorporada, mas está na versão 2.x.

Portanto, tecnicamente - esta é a maneira mais fácil de extrair os dados na versão menor que 2.0.

guy mograbi
fonte
Sim, o JSON é realmente analisado pelo código Psych, que também analisa o YAML no Ruby. E a análise JSON foi introduzida no Ruby v1.9.3 .
the Tin Man
11
A razão isto funciona é que semanticamente (mais) JSON é válido YAML (particularmente YAML 1.2)
Justin Ohms
4

Esses dados parecem estar no formato JSON.

Você pode usar esta implementação JSON para Ruby para extraí-la.

Justin Ethier
fonte