네트워크를 통해 데이터를 주고받기 위해 사용되는 데이터 형식
시스템 메모리에 0과 1로 적힌 데이터를 전달하거나 받고 싶을 때 다른 컴퓨터 사이에서 통용이 다를 수 있어 원형태로는 불가능하다.
0과 1로 된 객체를 약속한 형태로 변환했다가 다시 맞는 형식의 0과 1로 변환해서 나타내는 방식으로 전달하는데 이때 JSON을 이용할 수 있다.
즉 JSON은 시스템에 저장한 데이터를 나중에 꺼내와서 사용하거나 다른 컴퓨터로 보내고 싶을 때 사용할 수 있는 방법이다.
- 다른 컴퓨터 사이의 약속
- 사람이 읽고 쓰기 쉽게 표현하는 방법
- JSON을 통해 저장하고 전송하는 타입 = Data
❗️물론 네트워크에서 전달 될 때는 JSON 역시 0과 1로 되어있지만 사람이 불러와서 볼 때는 변환해서 보여줌
JSON으로 변환된 개체는 같은 아키텍쳐 내에서는 동일한 형태로 나타내진다.
JSON 개체에서 데이터 타입의 인스턴스를 디코딩하는 개체 - Class
JSONDecoder로 디코드할 타입은 JSONDecoder 인스턴스로 디코드할 수 있도록 Codable
프로토콜을 채택한다.
자신을 변환하거나 외부 표현으로 변환할 수 있는 타입 - Protocol
= 인코드, 디코드할 수 있는 타입
typealias Codable = Decodable & Encodable
struct GroceryProduct: Codable {
var name: String
var points: Int
var description: String?
}
let jsonString = """
{
"name": "Banana",
"points": 200,
"description": "A banana grown in Ecuador."
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
let product = try decoder.decode(GroceryProduct.self, from: jsonString)
print(product.name) // "Banana"
- JSONDecoder 선언
- String을 Data 타입으로 변환
- Data 타입을 JSONDecoder의
decode
메서드를 이용해 인스턴스
func decode<T>(
_ type: T.Type,
from data: Data
) throws -> T where T : Decodable
제네릭 타입 자체와 변환하려는 Data 타입을 파라미터로 받는다.
타입은 Decodable을 준수하는 타입이어야 한다.
throws
로 에러를 던질 수 있기 때문에 try
로 실행해서 에러를 처리해야 한다.
JSON과 그에 상응하는 Foundation 객체 간의 변환을 해주는 객체 -
Class
인코딩, 디코딩을 위한 키로 사용될 수 있는 타입
protocol CodingKey : CustomDebugStringConvertible, CustomStringConvertible, Sendable
Codable인 타입은 중첩된 열거형으로 CodingKeys를 선언해서 JSON의 키값을 swift의 네이밍 컨벤션에 맞게 변경해서 사용할 수 있다.
struct Landmark: Codable {
var name: String
var foundingYear: Int
var location: Coordinate
var vantagePoints: [Coordinate]
enum CodingKeys: String, CodingKey {
case name = "title"
case foundingYear = "founding_date"
case location
case vantagePoints
}
}
열거형 이름은 CodingKeys
로 CodingKey
를 준수하고 String
타입의 원시값 갖는다. 원시값으로 JSON의 키를 연결해주면 설정한 구조체의 프로퍼티 이름으로 키값을 불러와서 사용할 수 있다.
왕초보를 위한 JSON
왕초보를 위한 CodingKey
JSONSerialization
CodingKey
Encoding and Decoding Custom Types