개발을 잘하고 싶은 주니어?

JSONSerialization 공부하기 본문

개발/iOS

JSONSerialization 공부하기

데쿠! 2021. 11. 30. 21:28
반응형

JSON Parsing 하기

class JSONSerialization : NSObject

JSON을 Foundation objects로 변환하거나 그 반대를 하게 해주는 객체입니다. Foundation object를 JSON으로 바꾸기 위해서는 다음의 네 가지 조건을 지켜야 합니다.

1. top level object는 NSArray나 NSDictionary여야 합니다. 그렇지 않다면 fragmentsAllowed 옵션을 추가해줘야 합니다.

2. 모든 obejcts는 NSString, NSNumber, NSArray, NSDictionary or NSNull 중 하나입니다.

3. 모든 딕셔너리 key는 NSString입니다.

4. Numbers는 NaN이거나 무한대이면 안됩니다.

Swift 4.0 전까지는 json을 파싱할 때 주로 사용을 했지만 Codable이 나온 이후부터는 잘 사용하지 않는다고 합니다. json안의 json같이 복잡한 형태의 경우에는 JSONSerialization을 이용하면 하나하나 파싱을 따로 해줘야 하는데 Codable을 사용하면 그렇게 안해도 간편하게 파싱할 수 있습니다. Codable에 대한 글도 곧 올리겠습니다. (Codable이 훨씬 간편함)

Type Method - JSON data 생성

open class func data(withJSONObject obj: Any, options opt: JSONSerialization.WritingOptions = []) throws -> Data

Foundation object에서 JSON으로 변환해줍니다. 만약 obj가 JSON으로 제대로 변환이 되지 않으면 JSONSerialization은 exception을 던집니다.(throw) 실제 파싱이 이루어지기 전에 발생하기 때문에 이 메서드를 호출하기 전에 isValidJSONObject(_:)를 사용해서 input값이 유효한 JSON을 만들 수 있는지를 우선적으로 판단한 후에 이 메서드를 호출합니다. 

-> obj : JSON 데이터를 생성할 object입니다.

-> options : JSON 데이터를 생성할 때 필요한 옵션입니다. 

  • static var fragmentsAllowed : JSONSerialization.WritingOptions 

parser가 배열이나 딕셔너리가 아닌 top-level objects도 허가한다는 의미.

  • static var prettyPrinted : JSONSerialization.WritingOptions

결과 데이터를 적절한 띄어쓰기와 들여쓰기를 통해 보기 좋게 한다는 의미.

  • static var sortedKeys : JSONSerialization.WritingOptions

key를 사전 순으로 정렬한다는 의미.

  • static var withoutEscapingSlashes : JSONSerialization.WritingOptions

escaping slash를 제거한다는 의미.

예를 들어서 url값을 "https://google.com" 으로 보냈는데, 실제 json 파일에서 보면 "https:\/\/google.com" 으로 가는 경우가 있습니다. 이것을 방지하기 위해서 미리 option으로 .withoutEscapingSlashes를 추가해줍니다.

  • Return Value : JSON data 이거나 nil

Type Method - JSON Object 생성

open class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any {}

open class func jsonObject(with stream: InputStream, options opt: JSONSerialization.ReadingOptions = []) throws -> Any {}

JSON Data에서 Foundation object를 생성합니다.

guard let resultDict = try JSONSerialization.jsonObject(with: data) as? [String:AnyObject] else { return }

위의 코드처럼 jsonObject메서드를 이용해서 json data를 원하는 형태(여기서는 [String:AnyObject]로 변환할 수 있습니다.

 

 

 

 

반응형
Comments