簡體   English   中英

如何在UI中快速顯示JSON

[英]How display a JSON in the UI in swift

我嘗試在iPhone上適應Android應用程序,但是當我要求服務器獲取JSON對象時,出現致命錯誤:

致命錯誤:解開Optional值時意外發現nil

我認為故事板或其他內容中的文本字段初始化不正確,但找不到錯誤。

print(jsonResult)給了我很好的JSON,但是在出現致命錯誤之后。

import UIKit

class ViewController: UIViewController {



@IBOutlet weak var labelCategory: UILabel!
@IBOutlet weak var imageViewOneTrash: UIImageView!
@IBOutlet weak var textFieldCoordinate: UITextField!
@IBOutlet weak var textFieldAddress: UITextField!
@IBOutlet weak var buttonShare: UIButton!
@IBOutlet weak var buttonCoppy: UIButton!
@IBOutlet weak var buttonDelete: UIButton!
@IBOutlet weak var buttonMaps: UIButton!
@IBOutlet weak var addressTxtFld: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // 1
    let urlAsString = "http://www.website.sample"
    let url = NSURL(string: urlAsString)!
    let urlSession = NSURLSession.sharedSession()

    //2
    let jsonQuery = urlSession.dataTaskWithURL(url, completionHandler: { data, response, error -> Void in
        if (error != nil) {
            print(error!.localizedDescription)
        }

        // 3
        do{
            if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? [String:AnyObject] {

                print(jsonResult)
                // 4
                let jsonAddress: String! = jsonResult["trash_temp_address"] as! String

                dispatch_async(dispatch_get_main_queue(), {
                    self.addressTxtFld.text = jsonAddress
                })
            }

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

    })
    // 5
    jsonQuery.resume()

}

  override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

print(jsonResult)的結果是:

["result": <__NSArrayM 0x15d62770>(
{
    "cat_name" = Mobilier;
    "country_name" = France;
    "town_name" = Toulon;
    "town_postal_code" = 83200;
    "trash_temp_address" = "278-338 Chemin du Jonquet";
    "trash_temp_date_time" = "2016-05-22 17:49:14";
    "trash_temp_fk_category" = 2;
    "trash_temp_id" = 99;
    "trash_temp_img" = "/pics/IMG_20160622_174846.jpg.png";
    "trash_temp_latitude" = "43.1395197";
    "trash_temp_longitude" = "5.9106404";
}
)
]
  • 根對象是具有一個關鍵result的字典。
  • 關鍵result的值是字典數組

這將獲取密鑰trash_temp_address的值

if let jsonRootObject = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:AnyObject] { // mutable containers are not needed

    print(jsonRootObject)
    if let jsonResult = jsonRootObject["result"] as? [[String:String]],
       jsonAddress = jsonResult[0]["trash_temp_address"] {    
          dispatch_async(dispatch_get_main_queue()) {
             self.addressTxtFld.text = jsonAddress
          }
    }
    ...

第一次可能的崩潰可能在這里發生:

let jsonAddress: String! = jsonResult["trash_temp_address"] as! String

盡量避免隱式展開可選對象。 而且, text屬性已經是可選的。 所以我們可以這樣寫:

let jsonAddress = jsonResult["trash_temp_address"] as? String

下一次崩潰可能在這里發生:

self.addressTxtFld.text = jsonAddress

如果在故事板nib文件中未連接addressTxtFld插座。 要解決它,寫這個

self.addressTxtFld?.text = jsonAddress

PS這些建議修復了可能的崩潰。 但是這不是錯誤的邏輯。 使用新信息(JSON結構),顯然邏輯是錯誤的。 @vadian為您提供了正確解析邏輯的示例。

你的print(jsonResult)

顯示具有result鍵的對象和具有包含您的"trash_temp_address"一個對象的數組

您訪問類似這樣的內容:

let result = jsonResult["result"] as! [AnyObject]
let resultObj = result[0] as! [String: AnyObject]
let jsonAddress = resultObj["trash_temp_address"] as! String

(您可能需要更正此錯誤,因為我沒有在Xcode中嘗試它)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM