Ruby 使用 JSON
1. 什么是JSON
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。它使得人們很容易的進(jìn)行閱讀和編寫(xiě)。同時(shí)也方便了機(jī)器進(jìn)行解析和生成。
JSON 一共有兩種數(shù)據(jù)結(jié)構(gòu):對(duì)象和數(shù)組。
- 對(duì)象:使用
{}
來(lái)表示,數(shù)據(jù)結(jié)構(gòu)為:{key: value, key: value, ...}
。key、value這種組合也被成為鍵值對(duì)。取值方式是使用對(duì)象["key"]
。 - 數(shù)組:使用
[]
來(lái)表示,數(shù)據(jù)結(jié)構(gòu)為:["Andrew", "Alice", 8888, ...]
。取值方式是使用索引獲取。
常見(jiàn)的 JSON 的例子:
{
data: [
{
order_id: JD00229740498930-1,
created_at: "2020-05-01 10:04:10",
expressages: [
"您的快件已由本人簽收,感謝您使用京東物流,期待再次為您服務(wù)。",
"您的快件正在派送中,請(qǐng)您準(zhǔn)備簽收(快遞員:xxx,聯(lián)系電話(huà):xxxx)",
"您的快件已到達(dá)北京,共計(jì)4個(gè)包裹,為方便您簽收,我們將一次性為您派送,請(qǐng)注意查收",
"打包完成",
"掃描完成",
"揀貨完成",
"您的訂單已經(jīng)打印完成"
]
}
]
}
經(jīng)驗(yàn):
JSON 和 XML 將會(huì)成為您在開(kāi)發(fā)中讓前端獲取數(shù)據(jù)最常用的方式。
2. 使用 Ruby 來(lái)對(duì) JSON 進(jìn)行操作
2.1 安裝 json
開(kāi)始之前,我們需要安裝名為 json 的 Gem 來(lái)操縱 JSON(最新版本的 Ruby 已安裝了這個(gè) Gem)。
gem install json
2.2 解析JSON文件
首先,讓我們導(dǎo)入一個(gè)json到temp.json文件中。
echo "{
\"Shandong\": [
\"Jinan\",
\"Qingdao\",
\"Zibo\"
],
\"Guangdong\": [
\"Guangzhou\",
\"Shenzhen\",
\"DongGuan\"
],
\"Liaoning\": [
\"Shenyang\",
\"Dalian\",
\"Jinzhou\"
]
}" > temp.json
查看這個(gè) json 文件我們可以看到:
{
"Shandong": [
"Jinan",
"Qingdao",
"Zibo"
],
"Guangdong": [
"Guangzhou",
"Shenzhen",
"DongGuan"
],
"Liaoning": [
"Shenyang",
"Dalian",
"Jinzhou"
]
}
在跟這個(gè) json 同一目錄,我們創(chuàng)建一個(gè) Ruby 的腳本文件,內(nèi)容如下:
require 'json'
file = File.read('temp.json')
p JSON.parse(file)
# ---- 輸出結(jié)果 ----
{"Shandong"=>["Jinan", "Qingdao", "Zibo"], "Guangdong"=>["Guangzhou", "Shenzhen", "DongGuan"], "Liaoning"=>["Shenyang", "Dalian", "Jinzhou"]}
解釋?zhuān)?/strong>
可以看到結(jié)果被轉(zhuǎn)化為了一個(gè) Ruby 能夠解析的哈希,我們通過(guò)哈希的取值方式可以獲取想要部分的值,比如Shandong
對(duì)應(yīng)的值我們可以這樣獲取到:
p JSON.parse(file)["Shandong"]
# ---- 輸出結(jié)果 ----
["Jinan", "Qingdao", "Zibo"]
2.3 生成 JSON 文件
現(xiàn)在讓我們將一個(gè)哈希轉(zhuǎn)換成 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
運(yùn)行完代碼后,我們可以在腳本所在目錄找到 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)) # 將倒數(shù)第二行進(jìn)行替換
得到的文件被格式化:
{
"Shandong": [
"Jinan",
"Qingdao",
"Zibo"
],
"Guangdong": [
"Guangzhou",
"Shenzhen",
"DongGuan"
],
"Liaoning": [
"Shenyang",
"Dalian",
"Jinzhou"
]
}
3. 小結(jié)
本章節(jié)我們學(xué)習(xí)了什么是 JSON,使用Ruby來(lái)操作 JSON 需要先require 'json'
,解析需要使用JSON.parse
,生成 JSON 需要使用to_json
。