꾸준히 안타치기
JSON / Codable - Encoding and Decoding 본문
JSON 이 뭘까? JavaScript Object Notation
> 네트워크를 통해 데이터를 주고 받는데 사용되는 경량의 데이터 형식
> 자바스크립트 언어 에서 객체의 속성을 표현하기 위한 방법으로 사용하기 시작한 데이터 구조
JSON은 name - value 형태의 쌍으로 이뤄져있다.
이때 name은 무조건 String이다.
name | : | value |
String | 기본자료형(정수, 실수,논리값, 문자열 ), 배열, 객체가 들어올수 있다. |
{
} 는 객체를 의미 / 객체는 반드시 name-value의 쌍이다.
[ ] 는 배열
JSON에 사용되는 데이터 구조는 크게 2가지
JSON 객체 | { 키 : 값 , 키: 값 } | 여러 속성을 정의하는 순서 없는 집합 |
JSON 배열 | [객체1, 객체2, 객체3..] | 비슷한 객체가 반복 나열되는 순서화된 리스트 |
https://zeddios.tistory.com/148
https://developer.apple.com/documentation/foundation/jsonserialization
Apple Developer Documentation
developer.apple.com
https://learn-hyeoni.tistory.com/45
Swift에서 JSON Parsing하기 - JSONSerialization vs Codable
Swift에서 JSON Parsing하기 - JSONSerialization vs Codable 해당 내용은 회사에서 전사 세미나를 준비한 내용입니다. 오류가 있거나 수정되어야 할 내용이 있다면 언제든지 알려주세요. 저는 현재 챗봇 빌더
learn-hyeoni.tistory.com
인코딩과 디코딩
protocol Encodable/ A type that can encode itself to an external representation.
자신을 외부표현으로 (JSON) 인코딩
인코딩(Encoding)은 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 뜻합니다(출처 : 위키백과 - 부호화).
Encoding - 컴퓨터가 알아들을수 있게 변환하는 것

protocol Decodable / A type that can decode itself from an external representation.
Decoding - 인코딩의 반대작업
decode - 해독하다, 원래 코드로 되돌리다.
디코딩(Decoding)은 인코딩의 반대 작업을 수행하는 것을 뜻합니다.
또, 인코더(Encoder)는 부호화를 수행하는 장치나 회로, 컴퓨터 소프트웨어, 알고리즘을 뜻합니다.
Codable
스위프트 4 버전에서는 스위프트의 인스턴스를 다른 데이터 형태로 변환하고 그 반대의 역할을 수행하는 방법을 제공합니다. 스위프트의 인스턴스를 다른 데이터 형태로 변환할 수 있는 기능을 Encodable 프로토콜로 표현하였고, 그 반대의 역할을 할 수 있는 기능을 Decodable로 표현해 두었습니다. 그 둘을 합한 타입을 Codable로 정의해 두었습니다.
typealias Codable = Decodable & Encodable
Codable은 스위프트 4 버전에서 처음 소개한 프로토콜입니다. Codable은 다양한 상황에서 사용할 수 있습니다. 예를 들어 JSON 형식으로 서버와 애플리케이션이 통신한다면 Codable 프로토콜을 이용해 편리하게 인코딩 및 디코딩할 수 있습니다.

Decodable
스위프트 타입의 인스턴스로 디코딩할 수 있는 프로토콜입니다.
Encodable
스위프트 타입의 인스턴스를 인코딩할 수 있는 프로토콜입니다.
Codable
Coordinate 타입과 Landmark 타입의 인스턴스를 다른 데이터 형식으로 변환하고 싶은 경우에 Codable 프로토콜을 준수하도록 하면 됩니다. Codable 타입의 프로퍼티는 모두 Codable 프로토콜을 준수하는 타입이어야 합니다. 스위프트의 기본 타입은 대부분 Codable 프로토콜을 준수합니다.
struct Coordinate: Codable {
var latitude: Double
var longitude: Double
}
struct Landmark: Codable {
var name: String
var foundingYear: Int
var vantagePoints: [Coordinate]
var metadata: [String: String]
var website: URL?
}
CodingKey
자주 사용하게 될 JSON 형태의 데이터로 상호 변환하고자 할 때는 기본적으로 인코딩/디코딩할 JSON 타입의 키와 애플리케이션의 사용자정의 프로퍼티가 일치해야 합니다. 만약 JSON의 키 이름을 구조체 프로퍼티의 이름과 다르게 표현하려면 타입 내부에 String 타입의 원시값을 갖는 CodingKeys라는 이름의 열거형을 선언하고 CodingKey 프로토콜을 준수하도록 하면 됩니다. CodingKeys 열거형 케이스의 이름은 해당 프로퍼티의 이름과 일치해야 합니다. 그리고 프로퍼티의 열거형 케이스의 값으로 매칭할 JSON 타입의 키를 할당하면 됩니다. 만약, JSON 타입의 키와 프로퍼티 이름이 일치한다면 값을 할당하지 않아도 무방합니다.
인코딩/디코딩할 JSON타입(키:값)의 키와 사용자 정의 프로퍼티가 일치해야한다.
JSON키 이름을 구조체 변수이름과 다르게 표현하려면 코딩키를 사용해야한다.
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
}
}
https://www.boostcourse.org/mo326/lecture/18732?isDesc=false
JSONEncoder / JSONDecoder
스위프트 4 버전 이전에는 JSONSerialization을 사용해 JSON 타입의 데이터를 생성했습니다. 그러나 스위프트 4 버전부터 JSONEncoder / JSONDecoder가 Codable 프로토콜을 지원하기 때문에 JSONEncoder / JSONDecoder와 Codable 프로토콜을 이용해 손쉽게 JSON 형식으로 인코딩 및 디코딩할 수 있습니다. 즉, JSONEncoder 및 JSONDecoder를 활용하여 스위프트 타입의 인스턴스를 JSON 데이터로 인코딩, JSON 데이터에서 스위프트 타입의 인스턴스로 디코딩할 수 있습니다.
JSONEncoder
Codable 프로토콜을 준수하는 GroceryProduct 구조체의 인스턴스를 JSON 데이터로 인코딩하는 방법입니다.
struct GroceryProduct: Codable {
var name: String
var points: Int
var description: String?
}
let pear = GroceryProduct(name: "Pear", points: 250, description: "A ripe pear.")
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
do {
let data = try encoder.encode(pear)
print(String(data: data, encoding: .utf8)!)
} catch {
print(error)
}
// ----- 출력
{
"name" : "Pear",
"points" : 250,
"description" : "A ripe pear."
}
// Tip : encoder.outputFormatting = .prettyPrinted 설정하면 들여쓰기를 통해 가독성이 좋게 출력해줍니다.
JSONDecoder
JSON 데이터를 Codable 프로토콜을 준수하는 GroceryProduct 구조체의 인스턴스로 디코딩하는 방법입니다.
struct GroceryProduct: Codable {
var name: String
var points: Int
var description: String?
}
/// 스위프트 4 버전부터 """를 통해 여러 줄 문자열을 사용할 수 있습니다.
let json = """
{
"name": "Durian",
"points": 600,
"description": "A fruit with a distinctive scent."
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
do {
let product = try decoder.decode(GroceryProduct.self, from: json)
print(product.name)
} catch {
print(error)
}
// ----- 출력
"Durian"
Swift에서 Codable 사용하기
안녕하세요. 휴먼스케이프 Software Engineer Dia입니다. 😀
medium.com
https://tech.burt.pe.kr/swift/codable/encoding-decoding-custom-type
커스텀 타입 인코딩 및 디코딩 - 철이의 컴노리
Codable을 만드는 가장 쉬운 방법은 이미 Codable인 타입을 사용하여 속성을 선언하는 것입니다. Codable을 지원하는 타입은 String, Int 및 Double과 같은 표준 라이브러리 타입과 Date, Data 및 URL과 같은 Foun
tech.burt.pe.kr
https://jiseobkim.github.io/swift/2018/07/21/swift-Alamofire%EC%99%80-Codable.html
Swift - Alamofire와 Codable
나만의 공간
jiseobkim.github.io
참고 링크
'iOS > 서버연동' 카테고리의 다른 글
JSON / Codable - 부스트코스 예제 (0) | 2022.03.15 |
---|---|
Alamofire 예제 (0) | 2022.01.05 |
API Alamofire / SwiftJSON 사용법 공부하기***** (0) | 2021.12.27 |
댓글 구조 (0) | 2021.09.08 |
aws timezone시간 바꾸기 (0) | 2021.09.03 |