Analysieren einer JSON-Zeichenfolge in Ruby

359

Ich habe eine Zeichenfolge, die ich in Ruby analysieren möchte:

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

Gibt es eine einfache Möglichkeit, die Daten zu extrahieren?

Stange
quelle
22
JSON wird in Ruby direkt unterstützt und ist seit mindestens Ruby v1.9.3 verfügbar. Daher muss kein Gem installiert werden, es sei denn, Sie verwenden etwas Älteres. Verwenden require 'json'Sie einfach in Ihrem Code.
der Blechmann

Antworten:

559

Dies sieht aus wie JavaScript Object Notation (JSON) . Sie können JSON analysieren, das sich in einer Variablen befindet, z. B json_string.:

require 'json'
JSON.parse(json_string)

Wenn Sie einen älteren Ruby verwenden, müssen Sie möglicherweise den json gem installieren .


Es gibt auch andere Implementierungen von JSON für Ruby, die möglicherweise besser zu einigen Anwendungsfällen passen:

Greg
quelle
32
Sie können auch die Option symbolize_names auf true setzen, um Schlüssel als Symbole abzurufen. Beispiel:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa
31
JSON wird direkt in Ruby unterstützt und ist seit mindestens Ruby v1.9.3 verfügbar. Daher muss kein Gem installiert werden, es sei denn, Sie verwenden etwas Älteres. Verwenden require 'json'Sie einfach in Ihrem Code.
der Blechmann
212

Nur um die Antworten ein wenig zu erweitern, was mit dem analysierten Objekt zu tun ist:

# 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
Nevan König
quelle
sehr schön erklärt.
Berto77
7
Wichtiger Hinweis: '{ "a": "bob" }'ist gültig. "{ 'a': 'bob' }"ist nicht.
Ziggy
7
@LinusAn, da JSON doppelte Anführungszeichen um Zeichenfolgen erfordert. Siehe Zeichenfolge in der JSON-Definition ( json.org ): "Eine Zeichenfolge ist eine Folge von null oder mehr Unicode-Zeichen, die in doppelte Anführungszeichen gesetzt werden und Backslash-Escapezeichen verwenden."
Endorama
1
In vielen Fällen möchten Sie JSON.parsein einen Rettungsblock für einwickeln JSON::ParserError.
Johnml
JSON.parse("[#{value}]")[0]um den Fehler zu vermeidenA JSON text must at least contain two octets!
Rivenfall
39

Ab Ruby v1.9.3 müssen Sie keine Gems installieren, um JSON zu analysieren. Verwenden Sie einfach require 'json':

require 'json'

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

Siehe JSON bei Ruby-Doc.

dav_i
quelle
15

Es sieht aus wie eine JSON-Zeichenfolge. Sie können eine von vielen JSON-Bibliotheken verwenden und es ist so einfach wie:

JSON.parse(string)
Keymone
quelle
7

Das ist etwas spät, aber ich bin auf etwas Interessantes gestoßen, das wichtig zu sein scheint.

Ich habe diesen Code versehentlich geschrieben und er scheint zu funktionieren:

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

Ich war überrascht zu sehen, dass es funktioniert, da ich die YAML-Bibliothek verwende, aber es funktioniert.

Der Grund, warum es wichtig ist, ist, dass yamlRuby integriert ist, sodass es keine Edelsteininstallation gibt.

Ich verwende die Versionen 1.8.x und 1.9.x - die jsonBibliothek ist also nicht integriert, aber in Version 2.x.

Technisch gesehen ist dies der einfachste Weg, um die Daten in einer Version unter 2.0 zu extrahieren.

Kerl Mograbi
quelle
Ja, JSON wird tatsächlich vom Psych-Code analysiert, der auch YAML in Ruby analysiert. Und JSON-Parsing wurde in Ruby v1.9.3 eingeführt .
der Blechmann
1
Der Grund, warum dies funktioniert, ist, dass semantisch (die meisten) JSON gültig ist YAML (insbesondere YAML 1.2)
Justin Ohms