在 Ruby 中,json 库用于解析和生成 JSON(JavaScript 对象表示法)数据。它允许你将 Ruby 对象转换为 JSON 格式,或者将 JSON 格式的数据转换为 Ruby 对象。

1. 加载 JSON 库

要在 Ruby 中使用 JSON,首先需要加载 json 库:

require 'json'

2. 将 Ruby 对象转换为 JSON

可以使用 JSON.generateto_json 方法将 Ruby 数据结构(如哈希、数组等)转换为 JSON 格式。

示例 1:使用 JSON.generate

ruby_hash = { name: "John", age: 30, city: "New York" }
json_string = JSON.generate(ruby_hash)
puts json_string
# 输出: {"name":"John","age":30,"city":"New York"}

示例 2:使用 to_json(该方法是 json 模块的一部分)

require 'json'

ruby_hash = { name: "John", age: 30, city: "New York" }
json_string = ruby_hash.to_json
puts json_string
# 输出: {"name":"John","age":30,"city":"New York"}

3. 将 JSON 转换为 Ruby 对象

可以使用 JSON.parse 方法将 JSON 字符串转换为 Ruby 对象。

json_string = '{"name":"John","age":30,"city":"New York"}'
ruby_hash = JSON.parse(json_string)
puts ruby_hash
# 输出: {"name"=>"John", "age"=>30, "city"=>"New York"}

4. 处理 JSON 数组

如果你正在处理包含多个对象的 JSON 数组,过程是类似的。

json_string = '[{"name":"John","age":30},{"name":"Jane","age":28}]'
ruby_array = JSON.parse(json_string)
puts ruby_array
# 输出: [{"name"=>"John", "age"=>30}, {"name"=>"Jane", "age"=>28}]

5. 处理 JSON 错误

在解析 JSON 数据时,如果格式无效,你可能会遇到错误。为了优雅地处理错误,最好将解析操作放在 begin-rescue 块中。

begin
  invalid_json = '{"name":"John", "age":30' # 缺少闭括号
  ruby_object = JSON.parse(invalid_json)
rescue JSON::ParserError => e
  puts "解析错误: #{e.message}"
end

6. 漂亮地打印 JSON

如果你希望 JSON 格式更加可读,可以使用 JSON.pretty_generate 方法生成格式化的 JSON。

ruby_hash = { name: "John", age: 30, city: "New York" }
pretty_json = JSON.pretty_generate(ruby_hash)
puts pretty_json
# 输出:
# {
#   "name": "John",
#   "age": 30,
#   "city": "New York"
# }

7. 转换嵌套的 Ruby 对象

json 库也能够处理嵌套的结构,比如包含数组和哈希的对象。

nested_hash = { name: "John", address: { street: "123 Main St", city: "New York" }, friends: ["Jane", "Tom"] }
json_string = nested_hash.to_json
puts json_string
# 输出: {"name":"John","address":{"street":"123 Main St","city":"New York"},"friends":["Jane","Tom"]}

8. 将 JSON 保存到文件

你可以将 JSON 数据保存到文件中,通过将 JSON 字符串写入文件实现。

data = { name: "John", age: 30, city: "New York" }
File.open("data.json", "w") do |f|
  f.write(JSON.pretty_generate(data))
end

这会将 JSON 数据以漂亮格式保存到 data.json 文件中。


总结

  • JSON.generateto_json: 将 Ruby 对象转换为 JSON 格式。
  • JSON.parse: 将 JSON 字符串转换为 Ruby 对象。
  • JSON.pretty_generate: 将 Ruby 对象转换为格式化的、可读性强的 JSON。
  • JSON::ParserError: 处理解析 JSON 时的错误。
  • 文件操作: 可以将 JSON 数据读写到文件中。

Ruby 的 json 库非常适合用于处理 JSON 数据,尤其是在处理 API、配置文件等 JSON 数据交换格式时非常有用。