程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么代码没有在tableview中发布JSON信息大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么代码没有在tableview中发布JSON信息?

开发过程中遇到为什么代码没有在tableview中发布JSON信息的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么代码没有在tableview中发布JSON信息的解决方法建议,希望对你解决为什么代码没有在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,请注明来意。