JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。
官方文档:Using JSON with Custom Types
JSON 介绍:JavaScript Object Notation
SwiftyJSON是一个用于解析JSON数据的Swift库。它提供了简单易用的API,使得解析JSON数据变得更加方便快捷。优点是耦合性低,灵活性高,易用性强。我们可以快速上手使用。缺点是不像Codable或者Mapper那样有明显的映射关系。
基本使用
本文中的JSON数据格式
本地文件名:BookList.json
{
"list": [
{
"desc": "资布给回管并转例快真应社斗。需计分很称军次再派非示开。任状般目程公节石达油第易色常表报来。义造手群特做种响必总算政更。能段委百千工则达教图战越。他议她级对和报门各路子至设去见。",
"name": "蔡平",
"num": 25
},
{
"desc": "火型己江约统门山强前领周支团京多支。年会选品科还放们约石通次知酸育。团今年县受产共四金识次去号经音统学。当斯几精道口米由究即报热向专较你热。",
"name": "吴霞",
"num": 28
},
}
我们可以通过本地读取文件获取JSON对象,也可以网络获取
本地获取
func readLocalJSON() {
let json = EasyTestModel.getLocalJSON("BookList", "json")
updateModel(json)
}
/// 本地获取JSON
static func getLocalJSON(_ forResourceName: String, _ type: String) -> JSON {
let path = Bundle.main.path(forResource: forResourceName, ofType: type) ?? ""
var json = JSON()
do {
let data: Data = try Data(contentsOf: URL(fileURLWithPath: path))
json = try JSON(data: data)
return json
} catch {
print("读取本地文件失败:\(error.localizedDescription)")
}
return json
}
网络获取
func getNetModel() {
let url = GlobalConfig.BOOKLIST_URL
let parameters = ["key": "value"]
DispatchQueue.global().async {
Alamofire.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON(completionHandler: { response in
// 处理响应结果
if let value = response.result.value {
let json = JSON(value)
self.updateModel(json)
}
if let error = response.result.error {
print("Response error: \(error)")
}
})
}
}
获取了JSON对象后我们可以灵活的操作,可以使用点语法或下标访问JSON数据
let num = element["num"].intValue // 获取名为"num"的整数值
let name = element["name"].stringValue // 获取名为"name"的字符串值
let height = element["height"].doubleValue // 获取名为"height"的浮点数值
let isBook = element["isBook"].boolValue // 获取名为"isBook"的布尔值
也可以封装成对象
struct Book {
var authorNumber: Int
var authorName: String
var desc: String
}
func updateModel(_ json: JSON) {
let bookArr = json["list"].arrayValue
for element in bookArr {
let num = element["num"].intValue
let name = element["name"].stringValue
let desc = element["desc"].stringValue
let book = Book(authorNumber: num, authorName: name, desc: desc)
bookArray.append(book)
}
mTableView.reloadData()
}