在其自己的单独函数中解析 JSON 不起作用

Posted

技术标签:

【中文标题】在其自己的单独函数中解析 JSON 不起作用【英文标题】:JSON parsing in its own separate function is not working 【发布时间】:2016-11-10 06:07:46 【问题描述】:

我看过或读过的所有关于 Swift 3 JSON 解析的教程都包括将 JSON 解析代码放在 viewDidLoad() func/method 中,效果很好。我想将 JSON 解析代码放在它自己的函数中,并从viewDidLoad() 调用它。检查以下示例:

class ViewController: UIViewController 
    var ArrayImages = [String]();

    override func viewDidLoad() 
        super.viewDidLoad()

        var json = ParseJson();
        print("My Array = \(ArrayImages)");

    

    // NEW FUNCTION
    func ParseJson() 
        let url = URL(string: "http://etasawoq.com/go_categories.php")!

        URLSession.shared.dataTask(with: url)  (data, response, error) in
            if (error != nil)
                print("Error Found Creating URLSession : \(error)")
             else 
                if let ParsedJson = data 
                    do 
                        let json = try JSONSerialization.jsonObject(with: ParsedJson, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray

                        for x in json 
                            let row = x as! NSDictionary; 
                            let imageUrl = row["image_url"] as! String
                            self.ArrayImages.append(imageUrl);
                        
                     catch 
                        print("Json Processing failed \(error)");
                    
                
            
        .resume() // start session
    
 

不幸的是,调用ParseJson 函数时没有填充“ArrayImages”。打印输出是“我的数组 = []”。这是为什么?如何在将 JSON 解析代码保留在单独的函数中的同时解决此问题?

【问题讨论】:

你的ParseJson方法正在进行异步调用,所以它在后台执行,所以print("My Array = \(ArrayImages)");dataTask(with:)的完成块之前执行 即使您的代码都在viewDidLoad 中,您的代码也会有完全相同的问题。 那这个问题怎么解决呢?图片我想用演员的名字填充一个 tableView。我如何使用我当前的代码风格来实现这一点? @Aboodnet 为此,只需在 for 循环之后重新加载您的 Tableview tableview.reloadData() @NiravD 假设涉及表视图,请确保在主队列上完成调用。 【参考方案1】:

您的响应通过了块,因此您需要在块内部而不是外部打印数组,如下所示。

do 

                        let json = try JSONSerialization.jsonObject(with: ParsedJson, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray

                        for x in json 
                            let row = x as! NSDictionary; 
                            let imageUrl = row["image_url"] as! String
                            self.ArrayImages.append(imageUrl);
                        
                      print("My Array = \(ArrayImages)");
                    

【讨论】:

我之前尝试过,我知道它是这样工作的,但后来我想在 viewDidLoad() 中执行一些操作,比如更新标签甚至填充图像的 collectionView。你的方法行不通,因为一旦 .resume() 被击中,数组就会再次为空。 是的,但在各个方面你都会遇到这个问题。但是你得到回应后想做什么。 假设用来自 json url 的演员名称填充 tableView 这是最后一次成功回调,因此您可以在此处填充您的表格视图。使用此答案尝试一次。

以上是关于在其自己的单独函数中解析 JSON 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

解析 JSON 对象时 JSONSerilazation 不起作用

使用 pyspark 解析 JSON 时嵌套动态模式不起作用

将 JSON url 图片解析到 iOS 不起作用

在单独的线程中调用时,C# 2.0 函数不起作用

当json_decode、stripslashes等解决方案都不起作用时,如何在php中解析json?

Swift UrlSession 在 UrlSession 中不起作用