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
https://www.slingacademy.com/article/swift-how-to-convert-a-dictionary-to-json/
'Swfit' 카테고리의 다른 글
ActivityKit으로 Dynamic Island 만들어보기! (0) | 2023.10.21 |
---|---|
Property Wrapper 알아보기 (0) | 2023.10.03 |
UIButton 탭 시 image 색상 변경되지 않도록 설정하기 (0) | 2023.07.22 |
iOS App 제출 시 iPad 스크린샷 제외 (0) | 2023.05.14 |
UICollectionViewCell Cell 플립 기능 구현하기 (0) | 2023.01.17 |