복잡한 오브젝트 → JSON으로 전달하기

Tags
swift
 

자료들이 Codable 프로토콜을 따를 경우

Swift에서 복잡한 객체를 React Native으로 전달하기 위해서는 해당 객체를 JSON 형식으로 직렬화(serialize)해야 합니다. 이를 위해 Swift에서는 Codable 프로토콜을 사용하거나 직접 JSON 형식의 문자열을 생성할 수 있습니다.
다음은 Swift에서 Codable 프로토콜을 사용하여 복잡한 객체를 JSON 문자열로 변환하는 예시입니다.
import Foundation struct Person: Codable { var name: String var age: Int var address: Address } struct Address: Codable { var street: String var city: String var postalCode: String } let person = Person(name: "John Doe", age: 30, address: Address(street: "123 Main St", city: "Cityville", postalCode: "12345")) do { let jsonEncoder = JSONEncoder() let jsonData = try jsonEncoder.encode(person) if let jsonString = String(data: jsonData, encoding: .utf8) { print("JSON String: \(jsonString)") } } catch { print("Error encoding JSON: \(error)") }
위 코드에서 PersonAddressCodable 프로토콜을 따르고 있습니다. JSONEncoder를 사용하여 객체를 JSON 데이터로 인코딩하고, 이를 문자열로 변환하여 출력합니다.
이제 이 문자열을 React Native으로 전달하고, React Native에서는 해당 JSON 문자열을 파싱하여 JavaScript 객체로 사용할 수 있습니다. 기본적으로 React Native에서는 JSON 형식의 문자열을 다루는 데에 JSON.parse()를 사용합니다.
 
React Native 측에서 Swift에서 반환된 JSON 문자열을 다루는 예시:
import { NativeModules } from 'react-native'; const { MySwiftModule } = NativeModules; // Swift 모듈의 메서드를 호출하고 JSON 문자열을 받음 const jsonString = MySwiftModule.getComplexObjectAsJSON(); // JSON 문자열을 JavaScript 객체로 파싱 const jsonObject = JSON.parse(jsonString); // jsonObject를 사용하여 필요한 작업 수행 console.log(jsonObject);
 

예시

notion image
나 같은 경우는 에이슬립을 통해 측정된 수면 데이터 리포트 데이터를 swift에서 RN으로 올리길 원했다.
해당 구조체가 Codable 프로토콜을 충족하고 있어서 jsonencoder로 간단하게 JSON으로 변환해서 보낼 수 있었다.
 

Codable 프로토콜을 따르지 않을 경우, 직접 직렬화 하기

예, 만약 SDK에서 반환되는 결과물이 Codable 프로토콜을 따르지 않는다면, 직접 커스텀하게 JSON 데이터를 처리할 수 있습니다. 이를 위해 Swift에서는 JSONSerialization을 사용하여 JSON 데이터를 다룰 수 있습니다.
다음은 Codable을 따르지 않는 객체를 JSON 문자열로 변환하는 예시입니다:
swiftCopy code import Foundation struct CustomObject { var name: String var age: Int // ... 다른 속성들 } let customObject = CustomObject(name: "John Doe", age: 30 /*, ... 다른 속성들 */) do { let jsonObject: [String: Any] = [ "name": customObject.name, "age": customObject.age, // ... 다른 속성들 ] let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: []) if let jsonString = String(data: jsonData, encoding: .utf8) { print("JSON String: \(jsonString)") } } catch { print("Error encoding JSON: \(error)") }
위 코드에서 CustomObjectCodable 프로토콜을 따르지 않습니다. 대신에 JSONSerialization을 사용하여 CustomObject의 속성들을 직접 JSON 데이터로 변환합니다. 변환된 JSON 데이터를 문자열로 변환하여 출력합니다.
이제 이 JSON 문자열을 React Native으로 전달하고, React Native에서는 해당 JSON 문자열을 파싱하여 JavaScript 객체로 사용할 수 있습니다. 비록 Codable을 사용하지 않지만, 직접 JSON 데이터를 생성하여 처리할 수 있게 됩니다.
 
React Native 측에서 Swift에서 반환된 JSON 문자열을 다루는 예시:
import { NativeModules } from 'react-native'; const { MySwiftModule } = NativeModules; // Swift 모듈의 메서드를 호출하고 JSON 문자열을 받음 const jsonString = MySwiftModule.getComplexObjectAsJSON(); // JSON 문자열을 JavaScript 객체로 파싱 const jsonObject = JSON.parse(jsonString); // jsonObject를 사용하여 필요한 작업 수행 console.log(jsonObject);