JSON파일 Decode하기 (feat. Codable)

hoBahk·2021년 12월 15일
0

안녕하세요.
오늘은 JSON 파일을 만들고 타입에 매핑시켜 Decode하는 것을 알아보도록 하겠습니다.

JSON

JSON?

JSON(JavaScript Object Notation)은 key-Value로 이루어져있습니다.
데이터를 전달하기 위해 사람이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이며,
인터넷에서 자료를 주고 받을 때 주로 사용되곤 합니다.
예전에는 XML을 사용했지만 많은 곳에서 JSON으로 대체 되었습니다.

JSON 파일 만들기

먼저 json파일을 만들어줍니다.

저는 commandLine으로 진행했지만 Xcode에서 만들어줬습니다.

json파일을 데이터 형식으로 만들어주는 함수를 만들겠습니다.
file의 절대경로를 받아 Data타입으로 반환해줍니다.

  • String(contentsOfFile:) : file의 절대경로를 넣어주면 해당 파일의 내용을 String타입으로 만들어줍니다.
  • data(using:) : StringData타입으로 변형 해주는 String의 메서드입니다.
func loadJsonData(fileLocation: String) -> Data? {

    let data = try? String(contentsOfFile: fileLocation).data(using: .utf8)

    return data
}

다음 만들어줄 함수는 Data 타입을 decode해주는 함수입니다.

func decode(data: Data?) -> User? {
    
    guard let data = data else {
        return nil
    }
    let decodedData = try? JSONDecoder().decode(User.self, from: data)
    
    return decodedData
}

JSONDecodrdecode메서드를 활용해줍니다.
첫번째 인자에는 JSON 파일의 내용과 매핑할 타입을 적어줍니다.
두번째 인자에는 디코딩할 파일을 적어줍니다.

JSONDecoder().decode(User.self, from: data)

User타입은 무엇일까요?
User타입은 JSON의 내용에 맞게 매핑해주는 구조체를 정의한 것입니다.
아래와 같이 구현해주었습니다.

struct User: Codable {
    let userId: Int
    let name: String
    let emailAddress: String
}

아래의 JSON파일 내용과 어떻게 매핑하는지 대충 감이 오시죠?

{
    "userId": 1,
    "name": "Kale",
    "emailAddress": "kale@test.com"
}

JSON파일의 내용과 매핑하기 위해서는 Codable프로토콜을 채택합니다.
또 JSON의 key와 매핑할 타입의 프로퍼티의 이름을 같게 해주면 잘 매핑이 되지만 달라질 때를 위해서 Codingkey를 사용하게 되는데요.
오늘은 JSON 디코딩에 초점을 맞추기 위해 CodableCodingKey에 대해서 다음에 자세히 포스팅하겠습니다.

이렇게 하면 기능구현은 끝났습니다.

프린트를 해보겠습니다.

let fileLocation = "/Users/iOSDeveloper/Desktop/SWIFT/JsonTest/JsonTest/Test.json"
let data = loadJsonData(fileLocation: fileLocation)

if let decodedData = decode(data: data) {
    print("userId : ", decodedData.userId)
    print("name : ",decodedData.name)
    print("email : ",decodedData.emailAddress)
}

실행 화면


실험 코드
//Test.json
{
    "userId": 1,
    "name": "Kale",
    "emailAddress": "kale@test.com"
}
import Foundation

struct User: Codable {
    let userId: Int
    let name: String
    let emailAddress: String
}

func decode(data: Data?) -> User? {
    
    guard let data = data else {
        return nil
    }
    let decodedData = try? JSONDecoder().decode(User.self, from: data)
    
    return decodedData
}

func loadJsonData(fileLocation: String) -> Data? {

    let data = try? String(contentsOfFile: fileLocation).data(using: .utf8)

    return data
}

let fileLocation = "/Users/iOSDeveloper/Desktop/SWIFT/JsonTest/JsonTest/Test.json"
let data = loadJsonData(fileLocation: fileLocation)

if let decodedData = decode(data: data) {
    print("userId : ", decodedData.userId)
    print("name : ",decodedData.name)
    print("email : ",decodedData.emailAddress)
}

읽어주셔서 감사합니다.

profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글