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?


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:


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

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.


15

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

JSON.parse(string)

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.


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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.