2017-12-17 2 views
-1

문제입니다. 여기에서 json을 구문 분석하고 테이블보기에 표시하려면 신속한 4 및 디코딩 가능을 사용하고 있습니다. 하지만 형식 불일치 오류가 나타납니다. json :파싱 json xcode swift 4

https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=50fb91212a47432d802b3b1ac0f717a3 

내 구조는 다음과 같습니다.

struct Root : Decodable { 
    let status : String 
// let totalResults : Int 
    let articles : [Article] 
} 

struct Article : Decodable { 
    let source: Source 
    let author, title, description: String 
    let url: URL 
// let publishedAt: Date 
    let urlToImage: String 
} 

struct Source: Decodable { 
    let id, name: String 
} 

내있는 viewDidLoad는 다음과 같습니다

var articles : [Article]? = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableview.delegate = self 
     tableview.dataSource = self 
     fetchArticles() 
    } 

    func fetchArticles(){ 
    let jsonURLString = "https://newsapi.org/v2/top-headlines?sources=techcrunch&apiKey=50fb91212a47432d802b3b1ac0f717a3" 
    guard let url = URL(string: jsonURLString) else { return } 
     URLSession.shared.dataTask(with: url) { (data,response,err) in 
      guard let data = data else { return } 
      self.myArticles = [Article]() 
      do{ 
       let decoder = JSONDecoder() 
       decoder.dataDecodingStrategy = .base64 
       let root = try decoder.decode(Root.self, from: data) 
       self.myArticles = root.articles 
       DispatchQueue.main.async { 
        self.tableview.reloadData() 
       } 
      } catch let error{ 
       print(error) 
      } 
     }.resume() 
} 

내 cellForRowAtIndexPath 내가 무엇입니까

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let myCell = tableView.dequeueReusableCell(withIdentifier: "articleCell", for: indexPath) as! ArticleCell 

    let article = self.myArticles[indexPath.row] 
    myCell.title.text = article.title 
    myCell.body.text = article.description 
    myCell.author.text = article.author 
    myCell.imgView.downloadImage(from: ("https://tctechcrunch2011.files.wordpress.com/2017/04/uber-vs-waymo.png")) 

    return myCell 
} 

오류가 발생했습니다.

No errors, nothing loads to the table view. 

답변

0

오류가 명확합니다. 배열을 디코딩하려고하지만 객체는 사전입니다.

특수 디코딩을 포함한 JSON을 URLDate으로 디코딩합니다.

루트 객체가 사전이며, 키 articles는 기사를 포함하고 source는 사전되지 배열입니다

struct Root : Decodable { 
    let status : String 
    let articles : [Article] 
} 

struct Article : Decodable { 
    let source: Source 
    let author, title, description: String 
    let url: URL 
    let publishedAt: Date 
    let urlToImage: String 
} 

struct Source: Decodable { 
    let id, name: String 
} 

var articles = [Article]() 

do { 
    let decoder = JSONDecoder() 
    decoder.dateDecodingStrategy = .iso8601 
    let root = try JSONDecoder().decode(Root.self, from: data) 
    self.articles = root.articles 
    DispatchQueue.main.async { 
     self.tableview.reloadData() 
    } 
} catch { print(error) } 

필요에가 없습니다 NSObject

를 상속 한 클래스 사용 10

그리고 옵션으로 데이터 소스 오브젝트를 선언하고 cellForRow에서 같은 항목을 몇 번하지 않고는 indexPath.row

... 
let article = self.articles[indexPath.row] 
myCell.title.text = article.title 
myCell.body.text = article.description 
myCell.author.text = article.author 
... 
+0

OK, 난 여전히, 당신의 의견에 따라 변경입니다! – user3769888

+0

위 질문에 새 코드를 게시했습니다. 한 번 확인해 주시겠습니까? 이제 오류가 없으며 문제를 이해했습니다. 하지만 왜 테이블 뷰가로드되지 않는가! – user3769888

+0

답변에 제안 된 코드를 업데이트하는 질문을 수정하지 마십시오. 그것은 다른 독자를 혼동시킬 수 있습니다. 그리고 - btw - 당신은 데이터 소스 배열을 non-optional로 선언하겠다는 제 제안을 고려하지 않았습니다. 제가 실수를. 'root.articles'는'self.articles'에 할당되어야합니다. 나는 대답을 업데이트했다. – vadian