반응형
1. 우선 Json 파일을 땋, Atom 을 사용했습니다.
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
}
반응형
'iOS_Swift5' 카테고리의 다른 글
XCode15) could not find a storyboard named 'main' in bundle nsbundle (0) | 2022.03.30 |
---|---|
xcode - the remote repository rejected commits (0) | 2022.03.16 |
CoreML - Swift (0) | 2022.03.15 |
Swift5) Date(), DateFormatter() 날짜, 시간 표시하기 /iOS (0) | 2022.02.23 |
Swift) Pod install (0) | 2022.02.16 |