Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- UITextView
- Human interface guide
- tableView
- 리팩토링
- Protocol
- Clean Code
- uiscrollview
- Xcode
- 클린 코드
- 스위프트
- RxCocoa
- clean architecture
- swiftUI
- MVVM
- Refactoring
- ios
- Observable
- rxswift
- swift documentation
- combine
- uitableview
- 리펙토링
- HIG
- map
- collectionview
- UICollectionView
- 애니메이션
- 리펙터링
- ribs
- SWIFT
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 1. 인코딩 개념 - JSONSerialization와 JSONEncoder() 차이 본문
iOS 응용 (swift)
[iOS - swift] 1. 인코딩 개념 - JSONSerialization와 JSONEncoder() 차이
jake-kim 2023. 8. 29. 01:431. 인코딩 개념 - JSONSerialization와 JSONEncoder() 차이
2. 인코딩 개념 - JSONSerialization 사용 시 주의 사항
사전지식) Data 형태란?
- Data는 메모리에 있는 byte형태를 의미
- byte형태라는 의미는, 일종의 바이너리 형태의 데이터
- 바이너리 형태로 변환하면 좋은 이유
- 바이너리 형태로 변환하는 이유는 파일 입출력, 서버 통신, DB와 주고받을 때 통일된 방식으로 전환이 가능하며 효율적
- 만약 문자열로 데이터를 전송하면 텍스트를 유니코드 형태로 인코딩하고 디코딩해야 하므로 복잡성이 증가
JSONSerialization 개념
- jsonData를 [String: Any] 형태로 변환 or [String: Any]를 jsonData 형태로 변환
ex) JSONSerialization 예시
- 예제 jsonData 준비
- jsonString을 준비하고, String의 extension 메소드로 있는 data(using:) 사용
let jsonString = """
{
"name": "jake",
"age": 30,
"isStudent": false
}
"""
let jsonData = jsonString.data(using: .utf8)!
- JSONSerialization를 사용하여 변환: jsonData > Dictionary
- JSONSerialization의 static method인 jsonObject(with:) 사용
// jsonData > Dictionary
guard
let dictionary = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any]
else { return }
print(dictionary)
/*
["isStudent": 0, "age": 30, "name": jake]
*/
- JSONSerialization를 사용하여 변환: Dictionary > jsonData
- JSONSerialization.data(withJSONObject:, options:) 사용
// Dictinoary > jsonData
guard
let newJsonData = try? JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted)
else { return }
print(newJsonData)
/*
58 bytes
*/
JSONEncoder() 개념
- encodable을 따르는 struct 형을 jsonData로 변경하는 것
- JSONSerialization와 이름은 비슷하지만 다른 개념이므로 주의
- JSONSerialization은 jsonData와 Dictionary와의 변환이었다면, JSONEncoder는 codable을 따르는 struct 변환에 대한 개념
- JSONSerialization는 Dictionary <=> jsonData 양방향 변환이 가능하지만, JSONEncoder는 struct => jsonData 단방향
- jsonData로 struct 만들려면 JSONDecoder()사용해야함
ex) JSONEncder()로 struct를 jsonData로 만들기
- 데이터 준비
struct Person: Codable {
let name: String
let age: Int
let isStudent: Bool
}
let person = Person(name: "Jane Smith", age: 25, isStudent: true)
- JSONEncoder()로 person을 jsonData로 변환
// Codable 구조체 => jsonData
let jsonEncoder = JSONEncoder()
jsonEncoder.outputFormatting = .prettyPrinted
guard let jsonData = try? jsonEncoder.encode(person) else { return }
print(jsonData)
/*
63 bytes
*/
cf) JSONDecoder()로 jsonData를 struct로 변환
// jsonData => Codable 구조체
let jsonDecoder = JSONDecoder()
guard
let decodedPerson = try? jsonDecoder.decode(Person.self, from: jsonData)
else { return }
print(decodedPerson)
/*
Person(name: "Jane Smith", age: 25, isStudent: true)
*/
정리
- Data는 데이터를 주고 받을 때 사용하는 형태
- jsonData는 json 형태의 Data를 주고받을때 사용
- JSONSerialization과 JSONEncoder는 다른 것
- JSONSerialization: jsonData <=> [String: Any]
- JSONEncoder: struct => jsonData
- JSONDecoder: jsonData => struct
* 전체 코드: https://github.com/JK0369/ExJsonData
* 참고
'iOS 응용 (swift)' 카테고리의 다른 글
Comments