Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 1. 인코딩 개념 - JSONSerialization와 JSONEncoder() 차이 본문

iOS 응용 (swift)

[iOS - swift] 1. 인코딩 개념 - JSONSerialization와 JSONEncoder() 차이

jake-kim 2023. 8. 29. 01:43

1. 인코딩 개념 - JSONSerialization와 JSONEncoder() 차이

2. 인코딩 개념 - JSONSerialization 사용 시 주의 사항

사전지식) Data 형태란?

  • Data는 메모리에 있는 byte형태를 의미
  • byte형태라는 의미는, 일종의 바이너리 형태의 데이터
  • 바이너리 형태로 변환하면 좋은 이유
    • 바이너리 형태로 변환하는 이유는 파일 입출력, 서버 통신, DB와 주고받을 때 통일된 방식으로 전환이 가능하며 효율적
    • 만약 문자열로 데이터를 전송하면 텍스트를 유니코드 형태로 인코딩하고 디코딩해야 하므로 복잡성이 증가

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

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

* 참고

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

Comments