안녕하세요.
오늘은 JSON 파일을 만들고 타입에 매핑시켜 Decode하는 것을 알아보도록 하겠습니다.
JSON(JavaScript Object Notation)은 key-Value로 이루어져있습니다.
데이터를 전달하기 위해 사람이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이며,
인터넷에서 자료를 주고 받을 때 주로 사용되곤 합니다.
예전에는 XML을 사용했지만 많은 곳에서 JSON으로 대체 되었습니다.
먼저 json파일을 만들어줍니다.

저는 commandLine으로 진행했지만 Xcode에서 만들어줬습니다.
json파일을 데이터 형식으로 만들어주는 함수를 만들겠습니다.
file의 절대경로를 받아 Data타입으로 반환해줍니다.
String(contentsOfFile:) : file의 절대경로를 넣어주면 해당 파일의 내용을 String타입으로 만들어줍니다.data(using:) : String을 Data타입으로 변형 해주는 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
}
JSONDecodr의 decode메서드를 활용해줍니다.
첫번째 인자에는 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 디코딩에 초점을 맞추기 위해 Codable과 CodingKey에 대해서 다음에 자세히 포스팅하겠습니다.
이렇게 하면 기능구현은 끝났습니다.
프린트를 해보겠습니다.
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)
}
읽어주셔서 감사합니다.