大佬教程收集整理的这篇文章主要介绍了为什么代码没有在tableview中发布JSON信息,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
您好,我是编程初学者,我按照在线教程从 Json 文件中解析信息。为了获取 URL 链接,我创建了一个包含 Json 文件的本地服务器。当我启动程序时出现错误。
Called Thread 2: signal SIGABRT for the code snippet
let Json = try JsONserialization.JsonObject(with: data!,options: .mutableContainers) as! [String: AnyObject]
Google 说有一个未连接的插座,但我的代码中的插座已连接。
还有多个错误警告,Google说数组有问题,我必须将其设置为NSDictionary
,但我从未将任何变量声明为数组或字典。
Could not cast value of type '__NSArraym' (0x7fff80919120) to 'NSDictionary' (0x7fff809193b0).
2021-06-30 22:01:07.257592+0200 Booknerd3.0[71572:3475394] Could not cast value of type '__NSArraym' (0x7fff80919120) to 'NSDictionary' (0x7fff809193b0).
Could not cast value of type '__NSArraym' (0x7fff80919120) to 'NSDictionary' (0x7fff809193b0).
CoreSimulator 757.5 - Device: iPhone 8 (A2400EB4-8BA3-4297-9DF3-1743AA0BB7E4) - Runtime: iOS 14.5 (18E182) - DeviCEType: iPhone 8
Json 文件:
{
"books":
[
{
"author": "Chinua Achebe","country": "Nigeria","imagelink": "https://s3.amazonaws.com/AKIAJC5RLADLUMVRPFDQ.book-thumb-images/ableson.jpg","language": "English","link": "https://en.wikipedia.org/wiki/Things_Fall_Apart\n","pages": 209,"title": "Things fall Apart","year": 1958
},{
"author": "Hans Christian Andersen","country": "Denmark","imagelink": "https://s3.amazonaws.com/AKIAJC5RLADLUMVRPFDQ.book-thumb-images/ableson2.jpg","language": "Danish","link": "https://en.wikipedia.org/wiki/Fairy_Tales_Told_for_Children._First_Collection.\n","pages": 784,"title": "Fairy tales","year": 1836
}
]
}
我的视图控制器
import UIKit
class MainScreenVIEwController: UIVIEwController,UItableVIEwDelegate,UItableVIEwDatasource {
@IBOutlet weak var tablevIEw: UItableVIEw!
var books: [Books]? = []
overrIDe func vIEwDIDLoad() {
super.vIEwDIDLoad()
fetchArticle()
}
func fetchArticle(){
let urlrequest = URLrequest(url: URL(String: "http://localhost:3000/books")!)
let task = URLSession.shared.dataTask(with: urlrequest) { (data,response,error) in
if error != nil {
print(error)
return
}
self.books = [Books]()
do {
let Json = try JsONserialization.JsonObject(with: data!,options: .mutableContainers) as! [String: AnyObject]
if let booksFromJson = Json["books"] as? [[String : AnyObject]]{
for bookFromJson in booksFromJson {
let book = Books()
if let title = bookFromJson["title"] as? String,let author = bookFromJson["author"] as? String,let imagelink = bookFromJson["imagelink"] as? String {
book.author = author
book.title = title
book.imagelink = imagelink
}
self.books?.append(book)
}
}
dispatchQueue.main.async {
self.tablevIEw.reloadData()
}
} catch let error {
print(error)
}
}
task.resume()
}
func tableVIEw(_ tableVIEw: UItableVIEw,cellForRowAt indexPath: IndexPath) -> UItableVIEwCell {
let cell = tableVIEw.dequeueReusableCell(withIDentifIEr: "bookCell",for: indexPath) as! BookCell
cell.title.text = self.books?[indexPath.item].title
cell.author.text = self.books?[indexPath.item].author
return cell
}
func tableVIEw(_ tableVIEw: UItableVIEw,numberOfRowsInSection section: int) -> Int {
return self.books?.count ?? 0
}
func numberOfSections(in tableVIEw: UItableVIEw) -> Int {
return 1
}
}
}
简而言之,您的 Json 是一个字典,其中包含一个值为字典数组的键。当您解码时,您是说它将是书籍的字典键和字典数组的数组的值。
if let booksFromJson = json["books"] as? [[String : AnyObject]]...
字典数组
[String:Any]
更具体地说是你的情况
[String:[String: Any]]
,
大量的力量展开,关于类型的假设。如果您想拥有稳定的应用程序,请不要这样做。您很可能正在寻找 Decodable
的用法。您可以声明两个结构来反映 JSON 架构。
对于您的示例,它将是:
struct BooksResponse: Decodable {
let books: [Book]
}
struct Book: Decodable {
let author: String
let imageLink: URL
let title: String
}
只需少量修改即可在您的代码中使用。
// This part declared somewhere
enum JsonBooksDecodingError: Error {
case dataCorrupted
}
// --
func fetchArticle() {
guard let urlrequest = URLrequest(url: URL(String: "http://localhost:3000/books")) else {
assert(false,"URL broken")
}
URLSession.shared.dataTask(with: urlrequest) { (data,response,error) in
if error != nil {
print(error)
return
}
do {
let booksResponse = try handle(booksData: data)
self.books = booksResponse.books
DispatchQueue.main.async {
self.tableview.reloadData()
}
}
} catch let error {
print(error)
}
}
.resume()
}
func handle(booksData data: Data) throws -> BooksResponse {
guard let jsonData = jsonData else {
throw JsonBooksDecodingError.dataCorrupted
}
return try JSONDecoder().decode(BooksResponse.self,from: jsonData)
}
没有强制展开,没有猜测,零崩溃:)。这种方法也让您拥有自定义解码策略。您可以阅读有关 Codable (Decodable & EncodablE)
here
以上是大佬教程为你收集整理的为什么代码没有在tableview中发布JSON信息全部内容,希望文章能够帮你解决为什么代码没有在tableview中发布JSON信息所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。