iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
自我挑戰組

一個令我自豪的App完成之路系列 第 16

JSONDecoder 介紹 Day 16

  • 分享至 

  • xImage
  •  

JSONDecoder

將抓下來的資訊透過JSONDecoder這個將收集到的資訊進行使用

  • 建立需要使用的資料結構
  • 建立JSONDecoder實例
  • 利用JSONDecoder的decode func去解析所需要的文件,並儲存在相應的資料結構內

下面做個簡單的示範:

// 假設今天有個struct名為Price
struct Price:Codable{
	var apple:Int
	var banana:Int
	var pineapple:Int
}

// 本地端建立一個json檔
let json = """ 
	{
		"apple":10,
		"banana":20,
		"pineapple":30
	}
""".data(using: .utf8)!

// 建立一個JSONDecoder實例
let decoder = JSONDecoder()

// 透過解析json檔,將資料儲存在自定義的struct中
let price = try decoder.decode(Product.self,from:json)

// 印出10
print(price.apple)

在Decode的時候要注意的點:

需要注意JSON裡面是{}還是[]

使用[]符號的是Array

使用{}符號的是物件

這兩種在結構上存在差異:

struct decodeAll:Codable{
	// 代表裡面是[]陣列,還有東西在裡面
	let basket:[Ball]
	// 代表是物件,直接使用裡面的名字即可
	let basketball:String
}

// []陣列裡面的key-value搭配
struct Ball:Codable{
	let Ballname:String
}

另外有個例子:

"Basket":["BasketBall"]
使用JSONEditorOnline看到的會是
Basket[1]
[0:"BasketBall"]

這樣要怎麼解決,通常會使用key值作為decode媒介,但是這個沒有key
這邊會使用
struct decodeBasket:Codable{
	let Basket:[String]
}
直接將裡面的物件,用所屬的屬性decode

應用上會先使用URLSession進行網路連結

  • 透過URLSession與網路做溝通
  • 將傳回來的資料進行 Decode的動作,得到想要的資料
let url = URL(string:"http:.....")
let session = URLSession.shared
// 
let task = session.dataTask(with:URLRequest(url:url!)){(data,res,error) in 
	// 會回傳(data,res,error)資料,下面的函式都是基於這三個回傳資料進行
	
	if error != nil{
		print(error!)
		return
	}
	let decoder = JSONDecoder()
	// 使用DecumentData作為decode的結構,這邊省略寫下DocumentData的詳細結構
	guard document = try decoder.decode(DocumentData.self,from:data!)else{
		print("ERROR")
		return
		}
}
task.resume()

上一篇
URLSession 介紹 Day 15
下一篇
使用Google api查詢書本資訊 Day 17
系列文
一個令我自豪的App完成之路32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言