Как загрузить JSON и отрисовать список с данными в List?
Всем привет, я только начал изучать SWIFT. Подскажите пожалуйста как я могу сделать запрос и обработав список отобразить его в View(На примере параметра "name" в JSON). Вот моя структура:
struct Welcome: Codable {
var groups: [Group] = []
var goods: [Good] = []
}
struct Good: Codable {
let id: Int?
let name, text: String?
let price: Int?
let unit: String?
let index, img: String?
let groups: [String]?
}
struct Group: Codable {
let id, name, img: String?
}
Вот пример JSON:
{
"groups": [
{
"id": "123",
"name": "test",
"img": "123"
}
],
"goods": [
{
"id": 1,
"name": "123",
"text": "123",
"price": 75,
"unit": "123",
"index": "123",
"img": "123",
"groups": [
"123"
]
}
}
Я использую SWIFTUI 2
Ответы (2 шт):
Автор решения: ivanvorobei
→ Ссылка
Вам нужно разбить задачу на подзадачу.
- Получить данные (локально / веб-запрос)
- Спарить данные
- Обернуть в модели
- Сконфигурировать UI
Каждая из задач отдельный вопрос. Кода слишком много. Начните с первого пункта - в вебе есть информация.
Автор решения: schmidt9
→ Ссылка
- Гуглим
swiftui fetch json - Открываем первую же ссылку с примером
- Загоняем ваши данные в Mocky, параллельно исправив скобки и отформатировав
{
"groups": [
{
"id": "123",
"name": "test",
"img": "123"
}
],
"goods": [
{
"id": 1,
"name": "123",
"text": "123",
"price": 75,
"unit": "123",
"index": "123",
"img": "123",
"groups": [
"123"
]
}
]
}
- Копипастим код и подгоняем под наши нужды
// ...
struct Good: Codable, Identifiable { // -- added Identifiable for List
let id: Int?
let name, text: String?
let price: Int?
let unit: String?
let index, img: String?
let groups: [String]?
}
// ...
Используется связка observable / obverved для уведомления о получении данных
class MyJsonData : ObservableObject {
// 1.
@Published var welcome = Welcome()
init() {
let url = URL(string: "https://run.mocky.io/v3/fd0b7535-2718-4f44-acd2-0e4c86af69bd")!
// 2.
URLSession.shared.dataTask(with: url) {(data, response, error) in
do {
if let todoData = data {
// 3.
let decodedData = try JSONDecoder().decode(Welcome.self, from: todoData)
DispatchQueue.main.async {
self.welcome = decodedData
}
} else {
print("No data")
}
} catch {
print(error)
}
}.resume()
}
}
struct ContentView: View {
// 1.
@ObservedObject var myJsonData = MyJsonData()
let data = [""]
var body: some View {
// 2.
List(myJsonData.welcome.goods) { good in
// 3.
Text(good.name ?? "Unknown good")
}
}
}