본문 바로가기
Swfit

JSONSerialization 사용방법

by GGShin 2023. 9. 30.

JSONSerialization 이란?

JSON과 그에 동등한 Foundation 객체 간 변환을 가능하게 해주는 객체. (JSON에서 Foundation에서 지원하는 타입의 객체로 혹은 그 반대로 변환되도록 해준다는 의미)

 

Methods

1. JSON에서 Foundation 객체로 변환 시 

class func jsonObject(with: Data, options: JSONSerialization.ReadingOptions) -> Any

 

2. Foundation 객체에서 JSON으로 변환 시 

class func data(withJSONObject: Any, options: JSONSerialization.WritingOptions) -> Data

 

3. JSON으로 변환이 가능한 객체인지 확인 시

class func isValidJSONObject(Any) -> Bool

 

(다른 메서드들도 공식 문서에서 확인 가능)

 

사용 상황

JSON 형태를 Dictionary type으로 변환해서 사용하면 편리한 경우가 종종 있는데, 그럴 때 사용하면 편리함.

혹은 Dictionary 객체를 JSON파일로 만들어야 할 때 사용할 수도 있음.

 

예시 1.

JSON 형태를 Dictionary type으로 변환하는 경우.

Firestore 메서드 중 setData는 argument로 dictionary 형태를 받는다. 이때, 저장하고자 하는 데이터가 객체라면 JSONSerialization을 이용해서 편리하게 Dictionary type의 객체로 변경하여 setData에서 사용할 수 있다. (해당 객체는 Encodable를 conform해야 함)

//Firestore에 저장하고자 하는 객체의 타입
struct User: Codable {
    let id: String
    let name: String
    let email: String
    let joined: TimeInterval
}
// Encodable conform 하는 객체를 Dictionary type으로 바꿔주는 extension.
extension Encodable {
    func asDictionary() -> [String: Any] {
        guard let data = try? JSONEncoder().encode(self) else {
            return [:]
        }
        
        // JSONSerialization의 jsonObject(with:)을 이용해 Dictionary 형태로 바꾸어 줌.
        do {
            let json = try JSONSerialization.jsonObject(with: data) as? [String: Any]
            return json ?? [:]
        }
        catch {
            return [:]
        }
    }
}

 

asDictionary()라는 extension function을 만들어서 사용하면, 아래처럼 setData argument로 넣어 줄 수 있다.

let newUser = User(id: id,
                   name: name,
                   email: email,
                   joined: Date().timeIntervalSince1970)
        
let db = Firestore.firestore()
try await db.collection("users")
	.document(id)
	.setData(newUser.asDictionary())

예시 2.

Dictionary 객체를 JSON으로 변환

let dic: [String: Any] = [
            "name": "제이스",
            "age": 10
        ]
        
if JSONSerialization.isValidJSONObject(dic) {
     do {
     	// Dictionary type 객체를 JSON으로 변경. options에 원하는 option 명시 가능.
         let data = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)
         let jsonString = String(data: data, encoding: .utf8)
         print("JSON STRING\n \(jsonString ?? "")")
     }
     catch {
       // error handler  
     }
} else {
      print("The object cannot be converted to JSON.")
            
}

//Prints
// JSON STRING
// {
//  "name" : "제이스",
//  "age" : 10
// }

 

 

 

참고자료

https://developer.apple.com/documentation/foundation/jsonserialization

 

JSONSerialization | Apple Developer Documentation

An object that converts between JSON and the equivalent Foundation objects.

developer.apple.com

https://www.slingacademy.com/article/swift-how-to-convert-a-dictionary-to-json/

 

Swift: How to Convert a Dictionary to JSON - Sling Academy

Overview A Swift dictionary is a collection of unordered and unique key-value pairs. JSON is a lightweight and human-readable format for exchanging data.

www.slingacademy.com

 

반응형