**一、 前言
前幾天已經實際使用Open Library API搜尋書籍,
也觀察過API回傳的書名、作者、出版年份等資料。
這次想再更深入的去理解JSON,
不再只是看「有哪些資料」,
而是觀察這些資料是怎麼被組織起來的。
⸻
**二、API 回傳的整體結構
搜尋 Potter 後可以看到 API 回傳的 JSON
在資料中有一個很重要的部分:
"docs":[
往下看會發現裡面放著一筆又一筆的書籍資料。
可以簡單理解成:
API Response
│
├── numFound
├── start
├── q
└── docs
├── 第一本書
├── 第二本書
├── 第三本書
└── ...
所以 docs 並不是一本書的資料,
而是搜尋結果中的多筆書籍資料集合。
⸻
**三、什麼是 Array
在 JSON 中看到中括號 [] 時,
通常代表的是 Array
例如:
"docs":[
{...},
{...}
]
代表 docs 裡面可以放很多筆資料。
而我們前面看到的
"author_name":["J. K. Rowling"]
也使用了 []。
這代表 author_name 其實也是一個陣列。
這樣的設計可以讓一個欄位存放多個值,
例如一本書如果有多位作者就可以放入多個作者名稱。
因此看到 [] 時就可以先想到
這裡可能是一組資料而不一定只有一個值。
⸻
**四、什麼是 Object
在 JSON 中,大括號 {} 代表的是 Object
例如:
{
"author_name":["J. K. Rowling"],
"first_publish_year":1997
}
這一整個 {} 可以看成一個物件。
而在 docs 裡每一個 {} 就代表一筆書籍資料
所以可以想成:
docs
↓
[ 書籍物件、書籍物件、書籍物件…… ]
也就是一個 Array 裡面放著很多個 Object。
⸻
**五、JSON不只有文字和數字
前面的 Day 5 介紹過 JSON 有不同的資料型態,
今天可以直接從實際 API 回傳的資料中找到他們。
例如:
"q":"Potter"
這裡的 Potter 是文字,也就是 String。
"numFound":31782
這裡的 31782 是 Number。
另外還可以看到:
"numFoundExact":true
true 是 Boolean,只有 true 或 false 兩種狀態。
而:
"offset":null
則是 null,代表目前沒有實際的值。
代表同一份 API Response 裡可以同時出現:
String、Number、Boolean、null、Array、Object
這也是 JSON 可以用來表示複雜資料的原因。
⸻
**六、實際觀察API的JSON
今天可以繼續使用昨天搜尋過的Potter
打開 API 回傳的 JSON 後,
找到"q":"Potter"
開始觀察String
"numFound":31782
觀察 Number。
"numFoundExact":true
觀察 Boolean。
"offset":null
觀察 null。
"docs":[
觀察 Array,以及裡面一筆一筆的 Object。
⸻
**七、JSON結構
看完實際資料後可以把今天看到的結構簡單整理成:
Response Object
│
├── q → String
├── numFound → Number
├── numFoundExact → Boolean
├── offset → null
└── docs → Array
│
├── Object(書籍 1)
├── Object(書籍 2)
└── Object(書籍 3)
這樣就可以更清楚理解,
一個 API 回傳的 JSON 並不是單純的一長串文字,
而是由不同的資料型態和結構組合而成。
⸻
**八、總結
今天進一步分析了Open Library API回傳的JSON結構,
除了前幾天看到的書籍資訊之外,
這次開始觀察JSON本身的組成方式,
包括Object、Array、String、Number、Boolean和null。
其中docs是一個Array,
裡面包含一筆又一筆代表書籍的 Object。
透過實際查看 API 回傳結果,
可以發現原本在Day 5學到的JSON資料格式,真的會直接出現在Web API的Response裡。
下一篇會把前面幾天學到的書籍API操作整合起來,完成一次完整的小實作。