[ios] json 파일을 로드하고 파싱하자.

Yoon Yeoung-jin·2022년 9월 17일
0

iOS 개발

목록 보기
10/11

json 파일을 로드하고 파싱하자.

01. 개요

아래의 swift 30 project 를 진행하면서 project 5에서 json 파일을 사용하여 파싱하는 부분이 필요했다.

https://github.com/soapyigu/Swift-30-Projects

json 파일을 다루는 방법에 대해서 기록하기 위해 작성한다.

02. 내용

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
    }

참고 링크

profile
신기한건 다 해보는 사람

0개의 댓글