419 Stimmen

Parsen einer JSON-Zeichenkette in Ruby

Ich habe eine Zeichenkette, die ich in Ruby parsen 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?

635voto

Greg Punkte 33150

Dies sieht aus wie JavaScript-Objekt-Notation (JSON) . Sie können JSON parsen, das sich in einer Variablen befindet, z. B. json_string , etwa so:

require 'json'
JSON.parse(json_string)

Wenn Sie ein älteres Ruby verwenden, müssen Sie möglicherweise das json gem .


Es gibt auch andere JSON-Implementierungen für Ruby, die für einige Anwendungsfälle besser geeignet sein könnten:

238voto

nevan king Punkte 110579

Nur um die Antworten ein wenig zu erweitern, was mit dem geparsten 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

42voto

dav_i Punkte 26308

Ab Ruby v1.9.3 brauchen Sie keine Gems mehr zu installieren, um JSON zu parsen, verwenden Sie einfach require 'json' :

require 'json'

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

Siehe JSON bei Ruby-Doc.

18voto

keymone Punkte 7776

Sie sieht aus wie eine JSON-Zeichenkette. Sie können eine der vielen JSON-Bibliotheken verwenden, und es ist so einfach wie tun:

JSON.parse(string)

8voto

Adverbly Punkte 1366

Ich sehe hier keine Antworten, die das Parsen direkt in ein anderes Objekt als einen Hash erwähnen, aber es ist möglich, mit der schlecht dokumentierten object_class Option (siehe https://ruby-doc.org/stdlib-2.7.1/libdoc/json/rdoc/JSON.html ):

JSON.parse('{"foo":{"bar": 2}}', object_class: OpenStruct).foo.bar
=> 2

Der bessere Weg, diese Option zu lesen, ist "Die Ruby-Klasse, in die ein json-Objekt umgewandelt wird", was erklärt, warum sie standardmäßig auf Hash eingestellt ist. Ebenso gibt es eine array_class-Option für json-Arrays.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X