在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起已经支持JSON,因此除非您使用的是旧版本,否则无需安装gem。只需require 'json'在您的代码中使用即可。
Tin Man

Answers:


559

看起来像JavaScript Object Notation(JSON)。您可以解析驻留在某个变量(例如)中的JSON json_string,如下所示:

require 'json'
JSON.parse(json_string)

如果您使用的是较旧的Ruby,则可能需要安装json gem


还有其他针对JSON的JSON实现,可能更适合某些用例:


32
您还可以将选项symbolize_names设置为true,以便将键作为符号。范例:JSON.parse(string, symbolize_names: true) #=> {key: :value}
Nando Sousa 2014年

31
JSON在Ruby中直接受支持,并且至少从Ruby v1.9.3起已经支持JSON,因此除非您使用的是旧版本,否则无需安装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 2014年

7
重要说明:'{ "a": "bob" }'有效。"{ 'a': 'bob' }"不是。
Ziggy 2014年

7
@LinusAn,因为JSON需要在字符串周围用双引号引起来。请参阅JSON定义(json.org)中的字符串:“字符串是零个或多个Unicode字符的序列,使用反斜杠转义符将其括在双引号中。”
endorama 2014年

1
在许多情况下,您都希望将包裹JSON.parse在的救援块中JSON::ParserError
johnml 2014年

JSON.parse("[#{value}]")[0]为了避免错误A JSON text must at least contain two octets!
Rivenfall'Mar

39

从Ruby v1.9.3开始,您无需安装任何Gems即可解析JSON,只需使用require 'json'

require 'json'

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

请参阅Ruby-Doc中的JSON


15

它看起来像一个JSON字符串。您可以使用许多JSON库之一,它很简单:

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库以来,我惊讶地看到它有效,但是它有效。

之所以如此重要,是因为它是yamlRuby内置的,因此没有安装gem。

我正在使用版本1.8.x和1.9.x-因此该json库不是内置的,但它在版本2.x中。

因此从技术上讲-这是提取低于2.0版的数据的最简单方法。


是的,JSON实际上是由Psych代码解析的,该代码还解析Ruby中的YAML。Ruby v1.9.3中引入了JSON解析。
Tin Man

1
这样做的原因是,语义(大多数)JSON是有效的YAML(尤其是YAML 1.2)
Justin Ohms


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.