아래의 swift 30 project 를 진행하면서 project 5에서 json 파일을 사용하여 파싱하는 부분이 필요했다.
https://github.com/soapyigu/Swift-30-Projects
json 파일을 다루는 방법에 대해서 기록하기 위해 작성한다.
json 파일을 읽고 파싱하기 위해서는 위해서는 아래와 같은 형식을 사용하면 된다.
guard let url = Bundle.main.url(forResourcer: "<json 파일 이름>", withExtension: "<확장자>") else {return} // json 파일을 읽어오는 부분
do {
let data = try Data(contentsOf: url) <-- 읽어온 json 파일을 data 형식으로 변환
guard let rootObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String : Any] else { return } <-- Data 형식을 json 으로 변환
} catch {
return
}
함수 예시는 다음과 같다.
static func artistsFromBundle() -> [Artist] {
var artists = [Artist]()
/* json 파일을 읽어서 파싱하는 부분 */
guard let url = Bundle.main.url(forResource: "artistry", withExtension: "json") else {return artists}
do {
let data = try Data(contentsOf: url)
guard let rootObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String : Any] else { return artists }
guard let artistsObject = rootObject["artists"] as? [[String: AnyObject]] else { return artists }
for object in artistsObject {
if let name = object["name"] as? String,
let bio = object["bio"] as? String,
let imageName = object["image"] as? String,
let image = UIImage(named: imageName),
let worksObject = object["works"] as? [[String: String]] {
var works = [Work]()
for workObjeck in worksObject {
if let workTitle = workObjeck["title"],
let workImageName = workObjeck["image"],
let workImage = UIImage(named: workImageName + ".jpg"),
let info = workObjeck["info"] {
works.append(Work(title: workTitle, image: workImage, info: info, isExpanded: false))
}
}
let artist = Artist(name: name, bio: bio, image: image, works:works)
artists.append(artist)
}
}
} catch {
return artists
}
return artists
}