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.