搭配 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]
}
}

作品集

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com