迅速。如何处理json文件中的空值?

时间:2014-06-09 20:31:45

标签: ios json null swift

我正在从URL读取json,并且(我在ObjectiveC中遇到了同样的问题)这些值会导致我的应用程序崩溃。我对字符串和数字没有任何问题。我可以打印(值)但是当我将值分配给UILabel时,它会崩溃。

我使用此方法来读取JSON:

func jsonFromURL(jsonURL: String) -> Dictionary<String, AnyObject> {
    var jsonNSURL: NSURL = NSURL(string: jsonURL)
    let jsonSource: NSData = NSData(contentsOfURL: jsonNSURL)
    var json = NSJSONSerialization.JSONObjectWithData(jsonSource, options:NSJSONReadingOptions.MutableContainers, error: nil) as Dictionary<String, AnyObject>
    return json
}

...此代码将值分配给自定义单元格内的UILabel

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? {

    var regularTextCell:celda = celda(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
    var cell:celda = NSBundle.mainBundle().loadNibNamed("celda", owner: self, options: nil)[0] as celda

    cell.name.text = myJson["list"]![indexPath.row]!["name"] as String
    cell.id.text = "id: " + String(myJson["list"]![indexPath.row]!["id"] as Int)

    // THIS line crash because some values of adress are <null>
    cell.address.text = myJson["list"]![indexPath.row]!["address"] as String

    return cell

}

您可以在https://dl.dropboxusercontent.com/u/787784/example.json

查看JSON的示例

谢谢!

4 个答案:

答案 0 :(得分:17)

如果object as String不是object,您将从String等语法中获得例外。您可以使用object as? String来避免异常,这可能会导致niltext分配。

在您的具体情况下,您可以使用:

cell.address.text = (myJson["list"]![indexPath.row]!["address"] as? String) ?? "default"

我已将as替换为as?,并利用了nil-coalescing运算符??

答案 1 :(得分:9)

我在在线Swift教程中找到了这个解决方案。如何在Swift中处理null值是一个非常好的解决方案。

这是概念:

 let finalVariable = possiblyNilVariable ?? "Definitely Not Nil Variable"

在教程示例中:

  let thumbnailURL = result["artworkUrl60"] as? String ?? ""

以下是教程的链接: http://jamesonquave.com/blog/developing-ios-8-apps-using-swift-interaction-with-multiple-views/

答案 2 :(得分:6)

您可以将违规行更改为:

if let address = myJson["list"]![indexPath.row]!["address"] as? String {
  cell.address.text = address
}
else {
  cell.address.text = ""
}

as?运算符将以与as相同的方式投射值,但如果投射失败,它将改为分配nil

if let …语法将此与检查结合在一起,当转换失败(并返回nil)时,else块会运行

答案 3 :(得分:1)

如果您使用:

你可以这样:

let yourJSON = JSON.fromURL("https://dl.dropboxusercontent.com/u/787784/example.json")
for (i, node) in yourJSON["list"] {
    let isnull = node["address"].isNull
    println("//[\"list\"][\(i)]:\t\(isnull)")
}

//["list"][0]:  false
//["list"][1]:  false
//["list"][2]:  true
//["list"][3]:  false
//["list"][4]:  false
//["list"][5]:  true
//["list"][6]:  false
//["list"][7]:  false
//["list"][8]:  false
//["list"][9]:  false
//["list"][10]: false
//["list"][11]: false
//["list"][12]: true
//["list"][13]: false
//["list"][14]: false
//["list"][15]: false
//["list"][16]: false
//["list"][17]: false
//["list"][18]: false
//["list"][19]: false

不需要?!,并且在不存在的节点上不会崩溃。