搭配 AI 建立自己感興趣的 JSON API
新手剛開始學習串接網路 API 解析 JSON 時,常常會遇到以下兩個問題。
- 範例的 API 已經沒有在維護,無法串接。
- API 回傳的 JSON 內容不是自己感興趣的主題。
最近隨著 AI 的興起,彼得潘想到我們可以透過以下步驟快速建立自己喜歡的 JSON API。
- 請 AI 創作 JSON 或讀取網頁內容生成 JSON。
- 在 GitHub 新增檔案,貼上 AI 生成的 JSON。
- 取得 JSON API 的網址。
以下我們請 AI 產生 5 種常見的 JSON 例子。
- 內容是字串的 array。
- 第一層是 object( { } )。
- 第一層是 array( [ ] ),array 的成員是物件( { } )。
- 多層的 JSON,比方至少 4 層的 JSON。
- 讀取網頁內容產生 JSON。
內容是字串的 array
- 請 AI 產生自己感興趣的 JSON 內容。
prompt:
用 JSON 寫一個希臘神話角色名字的 array ,第一層是 [ ] ,寫台灣譯名,至少有二十個名字。
answer:
[
"宙斯",
"赫拉",
"波塞冬",
"哈迪斯",
"阿提米斯",
"阿波羅",
"阿瑞斯",
"阿芙洛狄忒",
"赫淮斯托斯",
"赫密斯",
"雅典娜",
"德彌特",
"阿斯忒瑞亞",
"赫耳墨斯",
"狄俄倪索斯",
"珀耳修斯",
"赫拉克勒斯",
"奧德修斯",
"阿基里斯",
"忒修斯"
]
- 在 GitHub 新增檔案,貼上 AI 生成的 JSON。
連到 GitHub 網站,點選左上的 New 建立 Repositories。
輸入 Repository 的名字,點選 Create Repository。
點選 create a new file。
輸入檔名和貼上 AI 產生的 JSON。
點選右上方的 Commit changes。
之後若想再新增 JSON,可點選 Add file 的 create new file。
- 取得 JSON API 的網址。
進入剛剛建立的 JSON 檔頁面,點選右上方的 Raw。
此時顯示的才是 JSON 內容的真正頁面,瀏覽器框框裡的網址即為我們可抓取 JSON 的 API 網址。
https://raw.githubusercontent.com/PeterPanSwift/JSON_API/main/GreekNames.json
第一層是 object( { } )
- 範例 1
prompt:
用 JSON 定義小王子的相關資訊,第一層是 { },資料以台灣中文呈現,key 用英文
answer:
{
"name": "小王子",
"author": "安托萬·德·聖修伯里",
"publishYear": "1943",
"characters": {
"littlePrince": {
"planet": "B-612",
"favoriteFlower": "玫瑰花",
"friends": ["狐狸", "飛行員"]
},
"fox": {
"quote": "人只有用心去看,才能看到真實。最重要的東西,肉眼是看不見的。"
},
"rose": {
"planet": "B-612"
},
"pilot": {
"relationshipWithPrince": "朋友"
}
},
"themes": ["愛", "友誼", "孤獨", "成長", "犧牲"],
"quotes": {
"mostFamous": "人只有用心去看,才能看到真實。最重要的東西,肉眼是看不見的。",
"aboutFriendship": "你要與我建立關係,就是你的我需要,就是你對我獨一無二。"
}
}
- 範例 2
我們也可以指定資料的類型,比方以下例子。
prompt:
用 JSON 定義小王子的相關資訊,第一層是 { },資料以台灣中文呈現,key 用英文,資料的類型包含字串,整數,浮點數和 array。
answer:
{
"name": "小王子",
"author": "安托萬·德·聖修伯里",
"publicationYear": 1943,
"language": "法語",
"translation": ["英語", "中文", "德語", "日語", "俄語"],
"numberOfPages": 96,
"characters": ["小王子", "玫瑰花", "飛行員", "狐狸", "地理學家"],
"ratings": 4.6,
"quote": "人只有用心去看,才能看到真實。事情的真相只能用心去看,最重要的事情看不見。"
}
第一層是 array( [ ] ),array 的成員是物件( { } )
- 範例 1
prompt:
用 JSON 定義歷代 Mac 的相關資訊,第一層是 [ ],array 的成員是物件( { } ),資料以台灣中文呈現,key 用英文
answer:
[
{
"modelName": "Macintosh 128K",
"releaseYear": 1984,
"processor": "Motorola 68000",
"RAM": "128 KB",
"OS": "System 1"
},
{
"modelName": "Macintosh Plus",
"releaseYear": 1986,
"processor": "Motorola 68000",
"RAM": "1 MB",
"OS": "System 3.0"
},
{
"modelName": "Macintosh Portable",
"releaseYear": 1989,
"processor": "Motorola 68000",
"RAM": "1 MB",
"OS": "System 6.0.4"
},
{
"modelName": "Power Macintosh 6100",
"releaseYear": 1994,
"processor": "PowerPC 601",
"RAM": "8 MB",
"OS": "System 7.1.2"
},
{
"modelName": "iMac G3",
"releaseYear": 1998,
"processor": "PowerPC G3",
"RAM": "32 MB",
"OS": "Mac OS 8.1"
},
{
"modelName": "MacBook Pro",
"releaseYear": 2006,
"processor": "Intel Core Duo",
"RAM": "512 MB",
"OS": "Mac OS X 10.4.6"
},
{
"modelName": "iMac (Retina 5K, 27-inch, Late 2014)",
"releaseYear": 2014,
"processor": "Intel Core i5",
"RAM": "8 GB",
"OS": "OS X Yosemite"
},
{
"modelName": "MacBook Pro (13-inch, M1, 2020)",
"releaseYear": 2020,
"processor": "Apple M1",
"RAM": "8 GB",
"OS": "macOS Big Sur"
}
]
多層的 JSON,比方至少 4 層的 JSON
prompt:
用 JSON 定義英國的相關資訊,JSON 有 4 層,資料以台灣中文呈現,key 用英文
answer:
{
"countryName": "英國",
"geography": {
"continent": "歐洲",
"area": {
"total": "242495 平方公里",
"land": "241930 平方公里",
"water": "565 平方公里"
}
},
"government": {
"type": "憲制君主制",
"monarch": {
"current": "伊莉莎白二世",
"reign": {
"start": "1952年",
"end": "在位中"
}
},
"primeMinister": {
"current": "鮑里斯·強森",
"term": {
"start": "2019年",
"end": "在任中"
}
}
},
"population": {
"total": "66000000",
"density": "275人/平方公里",
"largestCity": "倫敦"
},
"culture": {
"language": "英語",
"cuisine": {
"famousDishes": ["魚與薯條", "肉餡餅", "英式早餐"]
},
"sports": {
"popularSports": ["足球", "板球", "橄欖球"],
"famousClubs": ["曼聯", "利物浦", "切爾西"]
}
}
}
其它例子。
讀取網頁內容產生 JSON
寫 python 程式解析 html 產生 JSON。
請 AI 連網生成包含最新資訊的 JSON。
- 範例 1
AI 連網不是百分百成功,為了提高成功率,以下我們以較容易抓取的 wiki 網頁為例,並且要求 AI 不需連到其它網頁,限制 JSON 字數 1000 字以內。
prompt:
參考以下網頁,用 JSON 寫出劉德華的相關資訊,key 用英文,JSON 字數 1000 字以內。只需要參考以下網頁的內容,不需要再連到其它網頁。 https://zh.wikipedia.org/zh-tw/劉德華
answer:
{
"name": "劉德華",
"romanized_name": "Lau Tak Wah",
"english_name": "Andy Lau",
"nicknames": ["華仔", "劉天王"],
"nationality": "中華人民共和國(香港)",
"origin": "廣東新會縣荷塘鎮(今江門市)",
"birth_date": "1961-09-27",
"birth_place": "英屬香港新界大埔泰亨鄉(菜坑村)",
"profession": ["演員", "歌手", "監製", "填詞人", "出品人"],
"languages": ["粵語", "英語", "國語"],
"education": [
"大磡村街坊福利會小學",
"黃大仙天主教小學畢業",
"可立中學中五畢業",
"可立中學中六預科肄業",
"無線電視藝員訓練班第10期畢業",
"四川省川劇學校註冊學習"
],
"honorary_degrees": [
"藍仕橋大學榮譽博士",
"香港樹仁大學榮譽文學博士",
"香港演藝學院榮譽院士"
],
"religion": "佛教",
"spouse": "朱麗倩",
"marriage_year": "2008",
"children": 1,
"music_genres": ["華語流行", "粵語流行"],
"debut_year": "1981",
"debut_works": {
"tv_show": "香港香港:江湖再見",
"movie": "彩雲曲",
"album": "只知道此刻愛你"
},
"representative_works": {
"music_albums": [
"真我的風采",
"答案就是你",
"忘情水",
"五時三十分",
"真永遠",
"愛在刻骨銘心時",
"男人的愛",
"心藍",
"美麗的一天",
"如果有一天"
],
"songs": [
"可不可以",
"我恨我痴心",
"如果你是我的傳說",
"愛不完",
"再吻我吧",
"一起走過的日子",
"來生緣",
"謝謝你的愛",
"真情難收",
"獨自去偷歡",
"開心的馬騮",
"暗裡著迷",
"忘情水",
"天意",
"真永遠",
"今天",
"中國人",
"情深的一句",
"你是我的女人",
"笨小孩",
"孤星淚",
"冰雨",
"世界第一等",
"愛你一萬年",
"男人哭吧不是罪",
"我不夠愛你",
"心藍",
"當我遇上你",
"夏日Fiesta",
"練習",
"無間道",
"如果有一天",
"17歲"
],
"movies": [
"投奔怒海",
"法外情",
"最佳損友",
"旺角卡門",
"至尊無上",
"天若有情",
"異域",
"賭俠",
"與龍共舞",
"九一神鵰俠侶",
"雷洛傳",
"天長地久",
"天與地",
"大冒險家",
"烈火戰車",
"新上海灘",
"龍在江湖",
"賭俠1999",
"賭俠大戰拉斯維加斯"
]
}
}
- 範例 2
prompt:
用 JSON 定義最近五代 iPhone 的相關資訊,第一層是 [ ],資料以台灣中文呈現,key 用英文
answer:
AI 只找到最近兩代的 iPhone,不過其中一代竟然是還沒發表的 iPhone 15。
[
{
"model": "iPhone 15",
"announcement": "2023年9月預期公告",
"description": "iPhone 15 的設計將橋接標準和高階模型之間的差距。預計將取代 'Pro Max' 品牌的全新 'Ultra' iPhone 15 模型將可能於明年推出。預計所有或部分 iPhone 15 系列模型將放棄專有的 Lightning 接口,轉向 USB-C 接口。所有四款預定於明年推出的 iPhone 15 模型都將採用丸孔顯示設計,取代了凹口。",
"key_features": [
{
"feature": "Display",
"description": "Pill-and-hole display design"
},
{
"feature": "Port",
"description": "USB-C"
},
{
"feature": "Chip",
"description": "Next-generation technology from TSMC"
}
]
},
{
"model": "iPhone 14",
"description": "iPhone 14 和 iPhone 14 Pro 的螢幕大小為 6.1 吋,而 iPhone 14 Plus 和 iPhone 14 Pro Max 的螢幕大小為 6.7 吋。iPhone 14 和 iPhone 14 Plus 使用的是升級的 A15 晶片,iPhone 14 Pro 和 iPhone 14 Pro Max 則是全新的 A16 晶片。所有的模型都有 6 核心 CPU、5 核心 GPU 以及 16 核心神經網絡,但 A16 晶片在資料的處理頻率上更快。",
"key_features": [
{
"feature": "Display",
"description": "6.1 inch for iPhone 14 and iPhone 14 Pro, 6.7 inch for iPhone 14 Plus and iPhone 14 Pro Max"
},
{
"feature": "Chip",
"description": "A15 chip for iPhone 14 and iPhone 14 Plus, A16 chip for iPhone 14 Pro and iPhone 14 Pro Max"
},
{
"feature": "Camera",
"description": "Upgraded main camera for iPhone 14 Pro and iPhone 14 Pro Max with 48 million pixels, second-generation optical stabilization system, supports night portrait, macro photography, and Apple ProRAW format shooting"
}
]
}
]
其它範例。
ps: 值得注意的,連網的 AI 只能從簡單的網頁生成 JSON,較複雜的網頁則須另外寫爬蟲程式才能生成 JSON。
請 AI 寫出 JSON 對應的 Swift Codable 型別
練習寫出 JSON 對應的 Codable 型別後,我們也可以請 AI 寫出 JSON 對應的 Codable 型別,瞧瞧 AI 寫得有沒有比自己好。
比方以下是 AI 從劉德華 JSON 寫出的 Codable 型別。(ps: 原始的 JSON key 有底線,因此記得要將 JSONDecoder 的 keyDecodingStrategy 設為 .convertFromSnakeCase。)
import Foundation
struct AndyLau: Codable {
let name: String
let romanizedName: String
let englishName: String
let nicknames: [String]
let nationality: String
let origin: String
let birthDate: String
let birthPlace: String
let profession: [String]
let languages: [String]
let education: [String]
let honoraryDegrees: [String]
let religion: String
let spouse: String
let marriageYear: String
let children: Int
let musicGenres: [String]
let debutYear: String
let debutWorks: DebutWorks
let representativeWorks: RepresentativeWorks
struct DebutWorks: Codable {
let tvShow: String
let movie: String
let album: String
}
struct RepresentativeWorks: Codable {
let musicAlbums: [String]
let songs: [String]
let movies: [String]
}
}