JSON

juyoung999·2022년 6월 14일
0

야곰 커리어

목록 보기
12/20

JavaScript Object Notation

네트워크를 통해 데이터를 주고받기 위해 사용되는 데이터 형식

시스템 메모리에 0과 1로 적힌 데이터를 전달하거나 받고 싶을 때 다른 컴퓨터 사이에서 통용이 다를 수 있어 원형태로는 불가능하다.

0과 1로 된 객체를 약속한 형태로 변환했다가 다시 맞는 형식의 0과 1로 변환해서 나타내는 방식으로 전달하는데 이때 JSON을 이용할 수 있다.

JSON은 시스템에 저장한 데이터를 나중에 꺼내와서 사용하거나 다른 컴퓨터로 보내고 싶을 때 사용할 수 있는 방법이다.

  • 다른 컴퓨터 사이의 약속
  • 사람이 읽고 쓰기 쉽게 표현하는 방법
  • JSON을 통해 저장하고 전송하는 타입 = Data

❗️물론 네트워크에서 전달 될 때는 JSON 역시 0과 1로 되어있지만 사람이 불러와서 볼 때는 변환해서 보여줌

JSON으로 변환된 개체는 같은 아키텍쳐 내에서는 동일한 형태로 나타내진다.


JSON의 규칙

  • {} : 객체가 열리고 닫힘
  • [] : 배열
  • " " : 문자열
  • 문자열이 아닌 그 외 : 숫자
  • [{}{}{}...] : 객체의 배열


JSONDecoder

JSON 개체에서 데이터 타입의 인스턴스를 디코딩하는 개체 - Class

JSONDecoder로 디코드할 타입은 JSONDecoder 인스턴스로 디코드할 수 있도록 Codable 프로토콜을 채택한다.


Codable

자신을 변환하거나 외부 표현으로 변환할 수 있는 타입 - Protocol
= 인코드, 디코드할 수 있는 타입

typealias Codable = Decodable & Encodable


사용자 정의 타입의 JSON 사용

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"

  1. JSONDecoder 선언
  2. String을 Data 타입으로 변환
  3. Data 타입을 JSONDecoder의 decode 메서드를 이용해 인스턴스


decode

func decode<T>(
    _ type: T.Type,
    from data: Data
) throws -> T where T : Decodable

제네릭 타입 자체와 변환하려는 Data 타입을 파라미터로 받는다.
타입은 Decodable을 준수하는 타입이어야 한다.

throws로 에러를 던질 수 있기 때문에 try로 실행해서 에러를 처리해야 한다.


JSONSerialization

JSON과 그에 상응하는 Foundation 객체 간의 변환을 해주는 객체 -
Class


CodingKey

인코딩, 디코딩을 위한 키로 사용될 수 있는 타입

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
    }
}

열거형 이름은 CodingKeysCodingKey를 준수하고 String 타입의 원시값 갖는다. 원시값으로 JSON의 키를 연결해주면 설정한 구조체의 프로퍼티 이름으로 키값을 불러와서 사용할 수 있다.




왕초보를 위한 JSON
왕초보를 위한 CodingKey
JSONSerialization
CodingKey
Encoding and Decoding Custom Types

profile
iOS Developer

0개의 댓글