问题描述
我在应用程序中解析JSON,并且某些JSON具有我处理过的nil
值.但是,该应用程序仍向我显示JSON包含nil
值的错误.我的代码:
I parse JSON in my application and some of the JSONs have nil
values which I handled. However, the app still shows me the error that JSON contains nil
values. My code:
struct Response : Decodable {
let articles: [Article]
}
struct Article: Decodable {
let title: String
let description : String
let url : String
let urlToImage : String
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do {
let article = try JSONDecoder().decode(Response.self , from : data)
for i in 0...article.articles.count - 1 {
if type(of: article.articles[i].title) == NSNull.self {
beforeLoadNewsViewController.titleArray.append("")
} else {
beforeLoadNewsViewController.titleArray.append(article.articles[i].title)
}
if type(of : article.articles[i].urlToImage) == NSNull.self {
beforeLoadNewsViewController.newsImages.append(newsListViewController.newsImages[newsListViewController.newsIndex])
} else {
let url = URL(string: article.articles[i].urlToImage ?? "https://static.wixstatic.com/media/b77fe464cfc445da9003a5383a3e1acf.jpg")
let data = try? Data(contentsOf: url!)
if url != nil {
//make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
let img = UIImage(data: data!)
beforeLoadNewsViewController.newsImages.append(img!)
} else {
beforeLoadNewsViewController.newsImages.append(newsListViewController.newsImages[newsListViewController.newsIndex])
}
这是运行应用程序的错误:
This is the error running the app:
注意:
此JSON可与其他没有nil
值的网址一起使用.
Note:
This JSON works with other urls that don't have nil
values.
这是json
{
"status": "ok",
"source": "entertainment-weekly",
"sortBy": "top",
"articles": [
{
"author": null,
"title": "Hollywood's Original Gone Girl",
"description": null,
"url": "http://mariemcdonald.ew.com/",
"urlToImage": null,
"publishedAt": null
},
{
"author": "Samantha Highfill",
"title": "‘Supernatural’: Jensen Ackles, Jared Padalecki say the boys aren’t going ‘full-mope’",
"description": "",
"url": "http://ew.com/tv/2017/10/18/supernatural-jensen-ackles-jared-padalecki-season-13/",
"urlToImage": "http://ewedit.files.wordpress.com/2017/10/supernatural-season-13-episode-1.jpg?crop=0px%2C0px%2C2700px%2C1417.5px&resize=1200%2C630",
"publishedAt": "2017-10-18T17:23:54Z"
},
{
推荐答案
错误非常明显. JSONDecoder
将NSNull
映射到nil
,因此如果解码器要将nil
值解码为非可选类型,则解码器将引发错误.
The error is quite clear. JSONDecoder
maps NSNull
to nil
so the decoder throws an error if it's going to decode a nil
value to a non-optional type.
解决方案是将所有受影响的属性声明为可选.
The solution is to declare all affected properties as optional.
let title: String
let description : String?
let url : String
let urlToImage : String?
或自定义解码器以将nil
替换为空字符串.
or customize the decoder to replace nil
with an empty string.
并且因为JSONDecoder
将NSNull
映射到nil
,所以检查if ... == NSNull.self {
是没有用的.
And because JSONDecoder
maps NSNull
to nil
the check if ... == NSNull.self {
is useless.
不要使用丑陋的C风格的基于索引的循环使用
Don't use ugly C-style index based loops use
let response = try JSONDecoder().decode(Response.self , from : data)
for article in response.articles {
beforeLoadNewsViewController.titleArray.append(article.title)
}
PS:但是,为什么为了天堂的缘故,您将文章实例映射到(显然是)单独的数组?您获得了Article
实例,其中分别包含与一篇文章相关的所有内容.
PS: But why for heaven's sake do you map the article instance to – apparently – separate arrays? You got the Article
instances which contain everything related to one article respectively.
这篇关于JSON字符串中出现意外的nil的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!