iOS_Swift5

Json Decoding swift

summerorange 2022. 3. 14. 15:27
반응형

1. 우선 Json 파일을 땋, Atom 을 사용했습니다. 

product.json
0.00MB
example.json
0.00MB

2. 그 다음은 구조체 만들기, Codable 쓰기

struct Person: Codable {
    let first_name: String
    let last_name: String
    let age: Int
    let is_male: Bool
    let country: String
    let siblings: [String]
}


struct Root: Codable {
    let products: [Product]
}
struct Product: Codable {
    let id,product,description,price,feed,quantity,image: String
}

 

3. url을 알려준다.

guard let jsonURL = Bundle(for: type(of: self)).path(forResource: "example", ofType: "json") else { return }

// url
        guard let jsonFile =  Bundle.main.path(forResource: "product", ofType: "json") else { return }

와 같이 알려주고,

4. decode할 수 있도록 만들어주기

string으로 만들기도 하고

guard let jsonString = try? String(contentsOf: URL(fileURLWithPath: jsonURL), encoding: String.Encoding.utf8) else { return }

아니면

//bite를 구함
        guard let data = try? Data(contentsOf: URL(fileURLWithPath: jsonFile), options: []) else { return }

이렇게 만들어서

5. JSON Decoder()

 var person: Person?
        do {
            person = try JSONDecoder().decode(Person.self, from: Data(jsonString.utf8))
            print(person)
        } catch {
            print("error")
        }

으로 Json 을 Decode해준다. 위쪽은 json을 String 형태로 만들어주었고,

var product: Root?
        
        do {
            //let plantDataSerialized = try JSONDecoder().decode(Root.self, from: data)
            product = try JSONDecoder().decode(Root.self, from: data)
            print(product)

        } catch let error {
            print(error.localizedDescription)
        }

아래 버전은 bite를 구한 거에서 바로 만들어 줌 그럼 옵셔널 한 형태로 데이터가 만들어질 것이다. 

저기에서 product랑 person의 값은

Optional(parsingJSON.Root(products: [parsingJSON.Product(id: "1", product: "Rus Salatası...", description: "description...", price: "3.25", feed: "Bu menü 1 kişiliktir..", quantity: "1", image: "imageURL...")]))

이런 형태로 나온다.

6. 결과 추출

guard let result2 = product else {
            print("Error")
            return
        }
        print(result2)
        print(result2.products[0].image) // 이렇게 뽑아내는 건듯. 아...product 중에서...

이렇게나

guard let result = person else {
            print("nil")
            return
        }
        
        print(result.first_name)

 

이렇게 써서 결과를 추출한다

 

전체 코드:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // url
        guard let jsonFile =  Bundle.main.path(forResource: "product", ofType: "json") else { return }
        //bite를 구함
        guard let data = try? Data(contentsOf: URL(fileURLWithPath: jsonFile), options: []) else { return }
        print(data)
        var product: Root?
        
        do {
            //let plantDataSerialized = try JSONDecoder().decode(Root.self, from: data)
            product = try JSONDecoder().decode(Root.self, from: data)
            print(product)

        } catch let error {
            print(error.localizedDescription)
        }
        guard let result2 = product else {
            print("Error")
            return
        }
        print(result2)
        print(result2.products[0].image) // 이렇게 뽑아내는 건듯. 아...product 중에서...
        
        
        guard let jsonURL = Bundle(for: type(of: self)).path(forResource: "example", ofType: "json") else { return }
        guard let jsonString = try? String(contentsOf: URL(fileURLWithPath: jsonURL), encoding: String.Encoding.utf8) else { return }
        
        var person: Person?
        do {
            person = try JSONDecoder().decode(Person.self, from: Data(jsonString.utf8))
            print(person)
        } catch {
            print("error")
        }
        
        guard let result = person else {
            print("nil")
            return
        }
        
        print(result.first_name)
    }
}

struct Person: Codable {
    let first_name: String
    let last_name: String
    let age: Int
    let is_male: Bool
    let country: String
    let siblings: [String]
}


struct Root: Codable {
    let products: [Product]
}
struct Product: Codable {
    let id,product,description,price,feed,quantity,image: String
}

 

 

 

반응형