HTTP 통신을 통해 얻은 데이터를 Json parsing하는 방법에 대해 알아보겠습니다!
class JSONSerialization: NSObject
JSONSerialization는 NSObject타입으로, Foundation object 타입을 Json형태로 변환하거나 Json형태를 Foundation object 타입으로 변환할 때 사용하는 클래스입니다!
Foundation object를 Json형태로 변환하기 위해 object는 다음과 같은 요구사항을 지켜야 합니다
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의 값에 접근하면 된다.
class func data(withJSONObject: Any, options: JSONSerialization.WritingOptions) -> Data
//Returns JSON data from a Foundation object.
Foundation object로 부터 Json형태를 만들고자 할 때 사용한다.
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하다.
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)!
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