Ruby 使用 JSON
1. 什么是JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。
JSON 一共有两种数据结构:对象和数组。
- 对象:使用
{}
来表示,数据结构为:{key: value, key: value, ...}
。key、value这种组合也被成为键值对。取值方式是使用对象["key"]
。 - 数组:使用
[]
来表示,数据结构为:["Andrew", "Alice", 8888, ...]
。取值方式是使用索引获取。
常见的 JSON 的例子:
{
data: [
{
order_id: JD00229740498930-1,
created_at: "2020-05-01 10:04:10",
expressages: [
"您的快件已由本人签收,感谢您使用京东物流,期待再次为您服务。",
"您的快件正在派送中,请您准备签收(快递员:xxx,联系电话:xxxx)",
"您的快件已到达北京,共计4个包裹,为方便您签收,我们将一次性为您派送,请注意查收",
"打包完成",
"扫描完成",
"拣货完成",
"您的订单已经打印完成"
]
}
]
}
经验:
JSON 和 XML 将会成为您在开发中让前端获取数据最常用的方式。
2. 使用 Ruby 来对 JSON 进行操作
2.1 安装 json
开始之前,我们需要安装名为 json 的 Gem 来操纵 JSON(最新版本的 Ruby 已安装了这个 Gem)。
gem install json
2.2 解析JSON文件
首先,让我们导入一个json到temp.json文件中。
echo "{
\"Shandong\": [
\"Jinan\",
\"Qingdao\",
\"Zibo\"
],
\"Guangdong\": [
\"Guangzhou\",
\"Shenzhen\",
\"DongGuan\"
],
\"Liaoning\": [
\"Shenyang\",
\"Dalian\",
\"Jinzhou\"
]
}" > temp.json
查看这个 json 文件我们可以看到:
{
"Shandong": [
"Jinan",
"Qingdao",
"Zibo"
],
"Guangdong": [
"Guangzhou",
"Shenzhen",
"DongGuan"
],
"Liaoning": [
"Shenyang",
"Dalian",
"Jinzhou"
]
}
在跟这个 json 同一目录,我们创建一个 Ruby 的脚本文件,内容如下:
require 'json'
file = File.read('temp.json')
p JSON.parse(file)
# ---- 输出结果 ----
{"Shandong"=>["Jinan", "Qingdao", "Zibo"], "Guangdong"=>["Guangzhou", "Shenzhen", "DongGuan"], "Liaoning"=>["Shenyang", "Dalian", "Jinzhou"]}
解释:
可以看到结果被转化为了一个 Ruby 能够解析的哈希,我们通过哈希的取值方式可以获取想要部分的值,比如Shandong
对应的值我们可以这样获取到:
p JSON.parse(file)["Shandong"]
# ---- 输出结果 ----
["Jinan", "Qingdao", "Zibo"]
2.3 生成 JSON 文件
现在让我们将一个哈希转换成 JSON 文件。
require 'json'
data = {
Shandong: [
"Jinan",
"Qingdao",
"Zibo"
],
Guangdong: [
"Guangzhou",
"Shenzhen",
"DongGuan"
],
Liaoning: [
"Shenyang",
"Dalian",
"Jinzhou"
]
}
f=File.new("temp2.json","w+")
f.puts(data.to_json)
f.close
运行完代码后,我们可以在脚本所在目录找到 temp2.json 的文件。格式为:
{:Shandong=>["Jinan", "Qingdao", "Zibo"], :Guangdong=>["Guangzhou", "Shenzhen", "DongGuan"], :Liaoning=>["Shenyang", "Dalian", "Jinzhou"]}
Tips:上述的方法生成的 JSON 都在一行,使用
JSON.pretty_generate(data)
可以让 JSON 直接格式化。
f.puts(JSON.pretty_generate(data)) # 将倒数第二行进行替换
得到的文件被格式化:
{
"Shandong": [
"Jinan",
"Qingdao",
"Zibo"
],
"Guangdong": [
"Guangzhou",
"Shenzhen",
"DongGuan"
],
"Liaoning": [
"Shenyang",
"Dalian",
"Jinzhou"
]
}
3. 小结
本章节我们学习了什么是 JSON,使用Ruby来操作 JSON 需要先require 'json'
,解析需要使用JSON.parse
,生成 JSON 需要使用to_json
。