Ruby JSON(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在编程的世界中,数据的交换与传输如同人类语言中的翻译官,需要一种通用且高效的格式。Ruby JSON正是这样一个关键角色——它让 Ruby 程序能够与 JavaScript、Python 等其他语言无缝协作,成为跨平台开发的“通用语言”。无论是构建 API 接口、存储配置文件,还是与第三方服务交互,JSON 都是不可或缺的工具。

本文将从零开始,带编程初学者和中级开发者逐步探索 Ruby 中 JSON 的核心用法。通过实际案例和代码示例,您将掌握如何生成、解析、调试 JSON 数据,并了解其在真实场景中的应用技巧。


JSON 的基础概念:轻量级数据交换的“翻译官”

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其语法简洁且易于阅读。它通过键值对(Key-Value)结构组织数据,支持常见的数据类型,如字符串、数字、布尔值、数组、对象等。

在 Ruby 中,JSON 的处理主要依赖于标准库 json。通过这个库,开发者可以将 Ruby 对象序列化为 JSON 字符串,或将 JSON 字符串反序列化为 Ruby 对象。

JSON 与 Ruby 的映射关系

JSON 类型Ruby 对应类型
objectHash
arrayArray
stringString
numberInteger/Float
booleanTrueClass/FalseClass
nullNilClass

示例 1:JSON 与 Ruby 的双向转换

require "json"  

user = { name: "Alice", age: 30, is_student: false }  
json_string = user.to_json  
puts json_string  

parsed_data = JSON.parse(json_string)  
puts parsed_data.class  # Hash  
puts parsed_data["age"] # 30  

Ruby 中的 JSON 核心方法详解

1. 序列化:将 Ruby 对象转为 JSON

Ruby 的 to_json 方法和 JSON.generate 方法是序列化的两大核心工具。

示例 2:复杂对象的序列化

class Book  
  attr_accessor :title, :author, :price  

  def initialize(title, author, price)  
    @title = title  
    @author = author  
    @price = price  
  end  
end  

book = Book.new("The Ruby Way", "Hal Fulton", 39.99)  
json_book = book.to_json  
puts json_book  

2. 反序列化:将 JSON 转为 Ruby 对象

JSON.parse 方法可将 JSON 字符串还原为 Ruby 的 Hash 或 Array。若需将数据映射到自定义类,可结合 JSON#parsesymbolize_names 参数或自定义解析逻辑。

示例 3:反序列化与类实例化

json_str = '{"title":"Design Patterns", "author":"Erich Gamma", "price":45.50}'  
book_hash = JSON.parse(json_str)  
book = Book.new(**book_hash)  # Ruby 2.1+ 的关键字解构语法  
puts book.title  # Design Patterns  

处理复杂数据结构:嵌套与数组

当 JSON 数据包含嵌套对象或数组时,Ruby 的灵活性将充分展现。

示例 4:解析嵌套 JSON

nested_json = <<-JSON  
{  
  "user": {  
    "name": "Bob",  
    "hobbies": ["reading", "coding"],  
    "address": {  
      "city": "New York",  
      "zip": "10001"  
    }  
  }  
}  
JSON  

data = JSON.parse(nested_json)  
puts data["user"]["address"]["city"]  # New York  
puts data["user"]["hobbies"][1]      # coding  

异常处理:当 JSON 出现错误时

如果 JSON 字符串格式错误(如缺少引号、括号不匹配),JSON.parse 将抛出 JSON::ParserError 异常。开发者需通过 begin-rescue 块捕获并处理这类错误。

示例 5:异常处理实践

invalid_json = '{"invalid_key": unquoted_value}'  

begin  
  parsed = JSON.parse(invalid_json)  
rescue JSON::ParserError => e  
  puts "JSON 解析失败: #{e.message}"  
  # 输出: JSON 解析失败: 789: unexpected token at 'unquoted_value}'  
end  

与 HTTP 请求结合:从 API 获取 JSON 数据

在真实项目中,开发者常需通过 HTTP 请求获取 JSON 数据。Ruby 标准库 net/http 或第三方库 faraday 可简化这一过程。

示例 6:使用 Net::HTTP 获取天气数据

require "net/http"  
require "json"  

uri = URI("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London")  
response = Net::HTTP.get(uri)  
weather_data = JSON.parse(response)  

puts "当前温度: #{weather_data['current']['temp_c']}°C"  

高级技巧:自定义 JSON 序列化行为

通过覆盖 as_json 方法,开发者可控制 Ruby 对象序列化的输出格式。例如,隐藏敏感字段或添加计算属性。

示例 7:自定义序列化逻辑

class User  
  attr_accessor :id, :email, :created_at  

  def as_json(options = {})  
    {  
      user_id: id,  
      email: email,  
      created_date: created_at.strftime("%Y-%m-%d")  # 格式化日期  
    }  
  end  
end  

user = User.new  
user.id = 123  
user.email = "user@example.com"  
user.created_at = Time.now  

puts user.to_json  

总结与扩展学习

通过本文,您已掌握了 Ruby JSON 的核心方法、异常处理、复杂数据结构解析,以及与 HTTP 请求的结合应用。以下是一些进阶方向:

  1. 性能优化:在处理超大规模 JSON 时,考虑使用 ojyajl 等高性能 JSON 库替代标准库。
  2. JSON Schema 验证:通过 json-schema 库确保数据符合预定义的结构。
  3. 与 Rails 集成:在 Rails 应用中,JSON 处理常与 ActiveModel::SerializersJbuilder 结合使用。

掌握 Ruby JSON 的精髓,不仅能提升跨语言协作能力,更能为构建 RESTful API、数据中台等复杂系统打下坚实基础。现在,不妨动手尝试将本文的代码示例运行起来,感受 JSON 在 Ruby 中的魔法吧!

最新发布