在UICollectionView中解析本地JSON文件

时间:2019-04-30 05:20:24

标签: ios json swift

免责声明-我是Swift / IOS开发的新手

按照this教程,我能够通过执行以下操作来获取/显示本地JSON文件(实际上是.txt文件):

guard let path = Bundle.main.path(forResource: "test", ofType: "txt") else { return cell }
let url = URL(fileURLWithPath: path)

do{
    let data = try Data(contentsOf: url)
    let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)

    guard let array = json as? [Any] else {return cell}

    for user in array {
        guard let userDict = user as? [String: Any] else  { return cell }
        guard let mName = userDict["name"] as? String else { return cell }
        print(mName)
    }

}catch{
    print(error)
}

这工作正常,它会打印出我文件中的所有名称。


接下来,我想在UICollectionView中填充此数据。因此,我遵循了this教程。但是在本教程中,他正在从api /链接中获取JSON数据,如下所示:

import UIKit

typealias JSON = [String: Any]

class NetworkingService {

    static let shared = NetworkingService()
    private init() {}

    let session = URLSession.shared

    func getImgurs(success successBlock: @escaping (GetImgursResponse) -> Void) {
        guard let url = URL(string: "https://api.imgur.com/3/gallery/r/dogs") else { return }
        var request = URLRequest(url: url)
        request.addValue("Client-ID 40dfbed2b6935ec", forHTTPHeaderField: "authorization")

        session.dataTask(with: request) { (data, _, _) in
            guard let data = data else { return }
            do {
                guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON else { return }
                print(json)
                let getImgursResponse = try GetImgursResponse(json: json)
                DispatchQueue.main.async {
                    successBlock(getImgursResponse)
                }
            } catch {}
        }.resume()
    }

    func downloadImage(fromLink link: String, success successBlock: @escaping (UIImage) -> Void) {
        guard let url = URL(string: link) else { return }
        session.dataTask(with: url) { (data, _, _) in
            guard let data = data,
                let image = UIImage(data: data)
                else { return }
            DispatchQueue.main.async {
                successBlock(image)
            }
        }.resume()
    }
}

我首先尝试通过更改URL来使用与第一个教程相同的逻辑,如下所示:

import UIKit

typealias JSON = [String: Any]

class NetworkingService {

    static let shared = NetworkingService()
    private init() {}

    let session = URLSession.shared

    func getImgurs(success successBlock: @escaping (GetImgursResponse) -> Void) {
        //Changing the URL to local path
        guard let path = Bundle.main.path(forResource: "test", ofType: "txt") else { return }
        let url = URL(fileURLWithPath: path)            

        var request = URLRequest(url: url)
        request.addValue("Client-ID 40dfbed2b6935ec", forHTTPHeaderField: "authorization")

        session.dataTask(with: request) { (data, _, _) in
            guard let data = data else { return }
            do {
                guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON else { return }
                print(json)
                let getImgursResponse = try GetImgursResponse(json: json)
                DispatchQueue.main.async {
                    successBlock(getImgursResponse)
                }
            } catch {}
        }.resume()
    }

    func downloadImage(fromLink link: String, success successBlock: @escaping (UIImage) -> Void) {
        guard let url = URL(string: link) else { return }
        session.dataTask(with: url) { (data, _, _) in
            guard let data = data,
                let image = UIImage(data: data)
                else { return }
            DispatchQueue.main.async {
                successBlock(image)
            }
        }.resume()
    }
}

但是它返回到guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? JSON else { return }

有人可以给我建议如何实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下函数在UICollectionView中填充本地json数据

func getUsersList() -> [Any]{
    guard let path = Bundle.main.path(forResource: "test", ofType: "txt") else { return [] }
    let url = URL(fileURLWithPath: path)

    do{
        let data = try Data(contentsOf: url)
        let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)

        guard let array = json as? [Any] else {return []}

        return array;

    }catch{
        print(error)
        return []
    }
}

从函数获取列表后,使用相同的数组重新加载集合,如下所示:

var arrUsersLists : [Any] = []

override func viewDidLoad() {
    super.viewDidLoad()

    self.arrUsersLists = self.getUsersList()
    self.collectionView.reloadData()
}

答案 1 :(得分:0)

do{
    if let jsonObject: AnyObject = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: AnyObject] as AnyObject? {

        if let dict = jsonObject as? NSDictionary {
            if isDebuging {
                print(dict)
            }


        } else {
            print("not a dictionary")
        }
    }
    else {

        if isDebuging {
            print("Could not parse JSON: \(error!)")
        }


    }
}catch let  error as NSError {
    print(error.localizedDescription)
}