JSON parsing

도윤·2022년 1월 23일
0

HTTP 통신을 통해 얻은 데이터를 Json parsing하는 방법에 대해 알아보겠습니다!


JSONSerialization

class JSONSerialization: NSObject

JSONSerialization는 NSObject타입으로, Foundation object 타입을 Json형태로 변환하거나 Json형태를 Foundation object 타입으로 변환할 때 사용하는 클래스입니다!

Foundation object를 Json형태로 변환하기 위해 object는 다음과 같은 요구사항을 지켜야 합니다

  • framentsAllowed 옵션을 설정하지 않으면 NSArray나 NSDictionary 타입이 Top level obejct이다.
  • 모든 object는 NSString,NSNumber,NSArray,NSDictionary,NSNull의 인스턴스이다.
  • 모든 dictionary key는 NSString타입이다.
  • Number은 NaN이나 무한대이면 안된다.

func jsonObject

class func jsonObject(with: Data, options: JSONSerialization.ReadingOptions) -> Any
//Returns a Foundation object from given JSON data.

json형태의 데이터를 Foundation object 형태로 바꿔주는 메서드이다.

if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: [AnyObject]] {
    if let somthings = json["something"] as? [Any] {
        print(items)
    }
}

이와 같이 json의 값에 접근하면 된다.

func data

class func data(withJSONObject: Any, options: JSONSerialization.WritingOptions) -> Data
//Returns JSON data from a Foundation object.

Foundation object로 부터 Json형태를 만들고자 할 때 사용한다.

Coable

typealias Codable = Decodable & Encodable

Codable은 Decodable 프로토콜과 Encodable프로토콜이 합쳐진 것이다.
Json 객체로 변환하거나 json객체로부터 변환하고자 하면 Coable 프로토콜을 구조체가 채택하면 된다.

struct GroceryProduct: Codable {
    var name: String
    var points: Int
    var description: String?
}

Double,Int,String,URL,Data,Date 타입은 모두 Codable하다. 그래서 이와 같은 형태로 이뤄진 Array,Set,Dictionary 모두 Codable하다.

JSONDecoder

JSON object로 Data type의 인스턴스로 Decode하기 위한 Object JSONDecoder을 사용하기 위해서 객체가 Decodable 또는 Codable을 채택하고 있어야 한다.

struct GroceryProduct: Codable {
    var name: String
    var points: Int
    var description: String?
}
let json = """
{
    "name": "Durian",
    "points": 600,
    "description": "A fruit with a distinctive scent."
}
""".data(using: .utf8)!

decode

T.Type에 지정한 형태의 값으로 Data를 변환하는 메서드이다.

func decode<T>(T.Type, from: Data) -> T
let decoder = JSONDecoder()
let product = try decoder.decode(GroceryProduct.self, from: json)

print(product.name) // Prints "Durian"

앞서 첫번째 매개변수인 형태는 GroceryProduct구조체 타입을 지정했고, 위의 json 데이터를 두번째 매개변수로 넣고 product.name을 Print하면 앞서 json의 데이터 형태에 알맞게 들어갔음을 알 수 있다.

위에 데이터가 타당한 json의 형태가 아니라면 에러가 발생되기 때문에

do {
	let product = try decoder.decode(GroceryProduct.self, from: json)
} catch {
}

의 형태로 작성해줘야 한다!


출처 :
https://developer.apple.com/documentation/foundation/jsonserialization/
https://developer.apple.com/documentation/foundation/jsondecoder

0개의 댓글