Hello, I'm a beginner who started developing. Please understand the dirty coding.
There is an error when I try to configure url json model and create a view model and display it as a view. (use ForEach - List)
Would it be possible to get some help?
error msg:
typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: , debugDescription: "Expected to decode Array but found a dictionary instead.", underlyingError: nil))
my json:
{
"pol": [
{
"title": "t1",
"url": "url1",
"image_url": "url.3749063.jpg",
"contents": "c2",
"date": "2022-10-29 08:02:12"
},
{
"title": "title2",
"url": "url2",
"image_url": "url.3749062.jpg",
"contents": "c2",
"date": "2022-10-29 08:02:11"
},
{
"title": "title3",
"url": "url3",
"image_url": "url.3749062.jpg",
"contents": "c3",
"date": "2022-10-29 08:02:11"
}
],
"eco": [
{
"title": "t1",
"url": "url1",
"image_url": "url.3749063.jpg",
"contents": "c2",
"date": "2022-10-29 08:02:12"
},
{
"title": "title2",
"url": "url2",
"image_url": "url.3749062.jpg",
"contents": "c2",
"date": "2022-10-29 08:02:11"
},
{
"title": "title3",
"url": "url3",
"image_url": "url.3749062.jpg",
"contents": "c3",
"date": "2022-10-29 08:02:11"
}
],
"soc": [
{
"title": "t1",
"url": "url1",
"image_url": "url.3749063.jpg",
"contents": "c2",
"date": "2022-10-29 08:02:12"
},
{
"title": "title2",
"url": "url2",
"image_url": "url.3749062.jpg",
"contents": "c2",
"date": "2022-10-29 08:02:11"
},
{
"title": "title3",
"url": "url3",
"image_url": "url.3749062.jpg",
"contents": "c3",
"date": "2022-10-29 08:02:11"
}
]
}
NewsModel.swift:
import Foundation
struct NewsModel: Hashable, Codable {
let pol: News
let eco: News
let soc: News
}
struct News: Hashable, Codable {
let title: String
let url: String
let image_url: String
let contents: String
let date: String
}
NewsViewModel
import Foundation
class NewsViewModel: ObservableObject {
@Published var news: [NewsModel] = []
func fetch() {
guard let url = URL(string: "--url input--") else {
return
}
let task = URLSession.shared.dataTask(with: url) { [weak self ] data, _, error in
guard let data = data, error == nil else {
return
}
//convert JSON
do {
let news = try JSONDecoder().decode([NewsModel].self, from: data)
DispatchQueue.main.async {
self?.news = news
}
}
catch {
print(error)
}
}
task.resume()
}
}
SampleView.swift
import SwiftUI
struct SampleView: View {
@StateObject var newsViewModel = NewsViewModel()
var body: some View {
NavigationView() {
List() {
ForEach(newsViewModel.news, id: \.self) { news in
HStack(){
Text(news.eco.title)
}
}
}
.foregroundColor(.white)
.onAppear{
newsViewModel.fetch()
}
}
}
}
struct SampleView_Previews: PreviewProvider {
static var previews: some View {
SampleView()
}
}