在Ruby中解析JSON字符串

Rod*_*Rod 341 ruby json

我有一个我想在Ruby中解析的字符串:

string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来提取数据?

Gre*_*reg 532

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

require 'json'
JSON.parse(json_string)
Run Code Online (Sandbox Code Playgroud)

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


还有其他JSON for Ruby实现可以更好地适应一些用例:

  • 在Ruby中直接支持_JSON,至少从Ruby v1.9.3开始,因此除非你使用旧的东西,否则不需要安装gem.只需在代码中使用`require'json'`` (31认同)
  • 您还可以将选项symbolize_names设置为true,以便将键作为符号获取.例如:`JSON.parse(string,symbolize_names:true)#=> {key :: value}` (27认同)

nev*_*ing 200

只是为了解释一下如何解析对象:

# JSON Parsing example
require "rubygems"
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
Run Code Online (Sandbox Code Playgroud)

  • @LinusAn因为JSON需要围绕字符串使用双引号.请参阅JSON定义中的字符串(http://www.json.org/):"字符串是零个或多个Unicode字符的序列,用双引号括起来,使用反斜杠转义." (7认同)
  • 重要提示:`'{"a":"bob"}'`有效.`"{'a':'bob'}"`不是. (6认同)

dav*_*v_i 37

从Ruby v1.9.3开始,您不需要安装任何Gems来解析JSON,只需使用require 'json':

require 'json'

json = JSON.parse '{"foo":"bar", "ping":"pong"}'
puts json['foo'] # prints "bar"
Run Code Online (Sandbox Code Playgroud)

请参阅Ruby-Doc中的JSON.


key*_*one 14

它看起来像一个JSON字符串.您可以使用许多JSON库中的一个,它就像这样简单:

JSON.parse(string)
Run Code Online (Sandbox Code Playgroud)


Adv*_*bly 10

这里没有看到任何提到直接解析为哈希以外的对象的答案,但可以使用记录不充分的 object_class 选项(请参阅https://ruby-doc.org/stdlib-2.7.1/libdoc/ json/rdoc/JSON.html ):

JSON.parse('{"foo":{"bar": 2}}', object_class: OpenStruct).foo.bar
=> 2
Run Code Online (Sandbox Code Playgroud)

阅读该选项的更好方法是“JSON 对象变成的 ruby​​ 类”,这解释了为什么它默认为 Hash。同样,json 数组有一个 array_class 选项。


guy*_*abi 7

这有点晚了,但我遇到了一些有趣的东西,似乎很重要.

我不小心写了这段代码,它似乎工作:

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

我很惊讶地看到它起作用,因为我正在使用YAML库,但它确实有效.

它之所以重要,yaml是内置Ruby,因此没有gem安装.

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

从技术上讲 - 这是在低于2.0的版本中提取数据的最简单方法.

  • 这样做的原因是语义上(大多数)JSON 是有效的 YAML(特别是 YAML 1.2) (3认同)