【发布时间】:2018-11-12 07:37:18
【问题描述】:
我有一个看起来像这样的 json 文件:
{
"adTitle": "My Title",
"adURL": "https://mylink.com/",
"adImageURL": "http://mywebsite/bannerx@3x.png"
}
我从网站获取 JSON 值:http://mywebsite.com/file.json
问题是广告以某种方式无法加载 adImageURL,所以当我按下 UIImageView 时,但当我按下应该是 UIImageView 的区域时,它会打开我的 adURL。这是我用于 JSON 的代码:
var imageURL:String = "http://mywebsite/bannerx@3x.png"
var adURL:String = "https://mylink.com/"
func loadAdvertisement() {
// Set up the URL request
let todoEndpoint: String = "http://mywebsite.com/file.json"
guard let url = URL(string: todoEndpoint) else {
print("Error: cannot create URL")
return
}
let urlRequest = URLRequest(url: url)
// set up the session
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// make the request
let task = session.dataTask(with: urlRequest) {
(data, response, error) in
// check for any errors
guard error == nil else {
// print("error calling GET on /todos/1")
// print(error!)
return
}
// make sure we got data
guard let responseData = data else {
print("Error: did not receive data")
return
}
// parse the result as JSON, since that's what the API provides
do {
guard (try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: AnyObject]) != nil else {
print("error trying to convert data to JSON")
return
}
let json = try JSONSerialization.jsonObject(with: responseData, options:.allowFragments) as! [String:AnyObject]
if (json != nil) {
self.imageURL = (json["adImageURL"] as? String)!
self.adURL = (json["adURL"] as? String)!
print(self.imageURL)
print(self.adURL)
DispatchQueue.main.async { () -> Void in
self.loadAdImage(self.imageURL)
}
}
} catch {
print("error trying to convert data to JSON")
return
}
}
task.resume()
// let jsonURL = URL(string: "http://mywebsite.com/file.json")
// self.getDataFromUrl(jsonURL!, completion: (data:Data?, response:URLResponse?, error:Error?)) -> Void
}
func loadAdImage(_ url:String) {
getDataFromUrl(URL(string: url)!) { (data, response, error) in
DispatchQueue.main.async { () -> Void in
guard let data = data, error == nil else { return }
print(response?.suggestedFilename ?? "")
print("Download Finished")
self.advertImageView.image = UIImage(data: data)
}
}
}
func getDataFromUrl(_ url:URL, completion: @escaping ((_ data: Data?, _ response: URLResponse?, _ error: NSError? ) -> Void)) {
URLSession.shared.dataTask(with: url) { (data:Data?, response:URLResponse?, error:Error?) in
completion(data, response, error as NSError?)
}.resume()
}
在事件 LOG 中,打印出两个 print("error trying to convert data to JSON") 命令。我以前在我的项目中使用过这段代码,它工作得很好,但我不知道为什么它不再工作了。
【问题讨论】:
-
尝试捕捉
jsonObject(with:options:)抛出的错误,它应该告诉你JSON数据有什么问题。 -
@dr_barto - 我收到错误消息:“错误尝试将数据转换为 JSONError Domain=NSCocoaErrorDomain Code=3840“字符 180 周围的对象格式错误。” UserInfo={NSDebugDescription=字符 180 周围的对象格式错误。} 尝试将数据转换为 JSONError 时出错 Domain=NSCocoaErrorDomain 代码=3840“字符 180 周围的对象格式错误。” UserInfo={NSDebugDescription=字符 180 周围的对象格式错误。}´
-
嗯,对我来说听起来像是一个理由 :) 服务器发送格式错误的 JSON,所以打印出来看看有什么问题...
-
@dr_barto 从哪里打印出来?
-
将
responseData转换为字符串,例如如此处所述:gist.github.com/Edudjr/cbd09220de89679f25eced359a6b8e08