【发布时间】:2020-11-20 22:51:19
【问题描述】:
各位,我非常感谢您对 JSON 解码的帮助。我正在尝试从此链接获取 API:http://newsapi.org/v2/top-headlines?apiKey=a16b15f863454928804e218705d0f019+&country=us 我可能犯了一些非常业余的错误。第一次在这里上传问题。求帮助!
这是我的数据管理器
protocol NewsManagerDelegate {
func didUpdateNews(news: NewsModel)
}
import Foundation
struct NewsManager{
var delegate: NewsManagerDelegate?
let url = "https://newsapi.org/v2/top-headlines?apiKey=a16b15f863454928804e218705d0f019"
func fetchNews(_ countryName: String){
let newsUrlString = "\(url)+&country=\(countryName)"
performRequest(newsUrlString)
}
func performRequest(_ urlString: String){
if let url = URL(string: urlString){
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { (data, response, error) in
if error != nil {
print("networking error \(error!)")
return
}
if let safeData = data{
if let news = parseJSON(safeData){
delegate?.didUpdateNews(news: news)
}
}
}
task.resume()
}
}
func parseJSON(_ newsData: Data) -> NewsModel?{
do{
let decodedData = try JSONDecoder().decode(NewsData.self, from: newsData)
let sourceName = decodedData.articles[5].source.name
let titleName = decodedData.articles[5].title
let linkToImage = decodedData.articles[5].urlToImage
let news = NewsModel(sourceName: sourceName, titleName: titleName, linkToImage: linkToImage )
return news
}catch{
print(error)
return nil
}
}
}
和我的数据
import Foundation
struct NewsData: Codable {
let totalResults: Int
let articles: [Articles]
}
struct Articles: Codable{
let author: String?
let title: String
let description: String
let urlToImage: String
let source: Source
}
struct Source: Codable{
let name: String
}
我收到此错误
valueNotFound(Swift.String, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "articles", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "description", intValue: nil)], debugDescription: "Expected String value but found null instead.", underlyingError: nil))
我尝试将一些常量设为可选,但之后根本不会显示任何信息。
【问题讨论】:
-
您可以查看日志错误并尝试阅读它,它会告诉您导致问题的密钥的所有路径
-
由于您似乎确实获得了数据,但无法解析它,您应该尝试缩小范围。打印出 JSON 数据并将其缩减为无法解析的单个文章示例。将其作为字符串发布(很可能在“”-引号中以使其更易于阅读)并提供您收到的错误消息。这样人们发现错误的问题就会减少。