RubyでのJSON文字列の解析


359

Rubyで解析したい文字列があります。

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

データを抽出する簡単な方法はありますか?


22
JSONはRubyで直接サポートされており、少なくともRuby v1.9.3からサポートされているため、古いものを使用しない限り、gemをインストールする必要はありません。require 'json'コードで使用するだけです。
Tin Man

回答:


560

これはJavaScript Object Notation(JSON)のように見えます。次のjson_stringように、変数に存在するJSONを解析できます。

require 'json'
JSON.parse(json_string)

古いRubyを使用している場合は、json gemのインストールが必要になる場合があります。


RubyのJSONの他の実装には、いくつかのユースケースにより適しているものもあります。


32
また、キーをシンボルとして取得するために、オプションsymbolize_namesをtrueに設定することもできます。例:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa

31
JSONはRubyで直接サポートされており、少なくともRuby v1.9.3からサポートされているため、古いものを使用しない限り、gemをインストールする必要はありません。require 'json'コードで使用するだけです。
Tin Man

212

解析されたオブジェクトをどうするかで答えを少し拡張するだけです:

# 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

とてもうまく説明されました。
berto77 14年

7
重要な注意:'{ "a": "bob" }'は有効です。"{ 'a': 'bob' }"ではありません。
Ziggy 14年

7
@LinusAn JSONは文字列を二重引用符で囲む必要があるため。JSON定義(json.org)の文字列を参照してください:「文字列は、バックスラッシュエスケープを使用して、二重引用符で囲まれた0個以上のUnicode文字のシーケンスです。」
内部劇

1
多くの場合JSON.parse、のレスキューブロック内にラップする必要がありますJSON::ParserError
johnml 2014年

JSON.parse("[#{value}]")[0]エラーを回避するためA JSON text must at least contain two octets!
Rivenfall

39

Ruby v1.9.3以降では、JSONを解析するためにGemsをインストールする必要はありません。単に次を使用しますrequire 'json'

require 'json'

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

Ruby-DocのJSONを参照してください。


15

JSON文字列のように見えます。多くのJSONライブラリの1つを使用できます。これは、次のように簡単です。

JSON.parse(string)

7

これは少し遅いですが、私は貢献することが重要であると思われる興味深いものに出会いました。

私は誤ってこのコードを書いて、それが動作するようです:

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

私はYAMLライブラリを使用しているのでそれが機能するのを見て驚いたが、それは機能する。

これが重要な理由yamlは、Rubyに組み込まれているため、gemのインストールが不要だからです。

私はバージョン1.8.xおよび1.9.xを使用しています-そのため、jsonライブラリは組み込まれていませんが、バージョン2.xにあります。

技術的には、これは2.0より前のバージョンのデータを抽出する最も簡単な方法です。


はい、JSONは実際にはPsychコードによって解析され、RubyではYAMLも解析されます。また、JSON解析はRuby v1.9.3で導入されました
Tin Man

1
これが機能する理由は、意味的に(ほとんど)JSONが有効なYAML(特にYAML 1.2)であるということです
Justin Ohms


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.