[iOS] JSONEncoder, JSONDecoder

JSON


키 : 밸류로 이루어진 데이터를 전달하기 위해 사용하는 포맷이다. 과거에는 xml을 자주 사용했으나 요즘에는 주로 JSON을 사용한다.

{
    "name": "Durian",
    "points": 600,
    "description": "A fruit with a distinctive scent."
}





JSONEncoder


인코딩은 데이터를 컴퓨터가 이해 할 수 있는 형태로 변환하는 것이다. 데이터를 -> JSON으로 사용방법은 JSONEncoder생성 -> JSONEncoder의 .encode 메소드를 사용해서 인스턴스를 Data타입으로 변환 -> Data타입을 String으로

struct Student: Encodable {
    var firstName: String
    var lastName: String
    var age: Int
    var birthday: Date
}

var manuel = Student(firstName: "manuel", lastName: "neuer", age: 20, birthday: Date())

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
encoder.keyEncodingStrategy = .convertToSnakeCase
encoder.dateEncodingStrategy = .iso8601
//encoder.dateEncodingStrategy = .formatted(DateFormatter)

let data = try encoder.encode(manuel)
print(String(data: data, encoding: .utf8)!)

/* 
스네이크, iso8601 
{
  "age" : 20,
  "last_name" : "neuer",
  "birthday" : "2021-05-24T19:03:31Z",
  "first_name" : "manuel"
}
*/

/* 
카멜케이스
{
  "age" : 20,
  "birthday" : 643575336.96005201,
  "lastName" : "neuer",
  "firstName" : "manuel"
}
*/

encode를 사용하기 위해서는 Encodable 프로토콜을 채택하거나 Codable 프로토콜을 채택하면된다. Codable 프로토콜은 Encodable & Decodable로 이루어져 있다. outputFormatting속성에서 prettyPrinted를 사용하면 더 보기 편하게 결과를 출력해준다.
키표시 종류에는 카멜케이스와 스네이크가 있다. 카멜케이스는 lastName처럼 띄어쓰기 대신 대문자를, 스네이크는 _를 사용한다. convertToSnakeCase로 스네이크 방식으로 출력 가능하다.
날짜 인코딩 방법으로는 iso8601, DateFormatter를 직접 설정한 방법이 있다.



JSONDecoder


디코딩은 인코딩의 반대개념이다. 인코딩된 데이터를 우리가 사용하는 데이터로 바꾸는 것. 사용순서도 인코딩의 반대로 String을 Data로 바꾸고 -> decode를 사용해서 인스턴스로 변환

struct GroceryProduct: Codable {
    var name: String
    var points: Int
    var description: String?
}

let json = """
{
    "name": "Durian",
    "points": 600,
    "description": "A fruit with a distinctive scent."
}
""".data(using: .utf8)!

let decoder = JSONDecoder()
let product = try decoder.decode(GroceryProduct.self, from: json)

print(product.name) // Prints "Durian"

Tags: ,

Categories:

Updated: