Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
167 views
in Technique[技术] by (71.8m points)

ios - unexpectedly found nil while unwrapping an Optional value reading JSON

people, I can not understand why, but this problem (unexpectedly found nil while unwrapping an Optional value) happens in this line:

var dict: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary

see the code:

import Foundation

class ProdutoService {

// return a produtos Array
class func getProdutos() -> Array<Produto> {

    var produtos: Array<Produto> = []

    for (var i = 0; i < 10; i++) {
        var p = Produto()
        p.nome = "Produto (i)"
        p.desc1 = "Descri??o (i)"
        p.desc2 = "Descri??o (i)"

        produtos.append(p)
    }

    return produtos
}

// get from JSON
class func getProdutosByJson() -> Array<Produto> {

    let path = NSBundle.mainBundle().pathForResource("produtos", ofType: "json")!
    let data = NSData(contentsOfFile: path)

    let produtos = parserJson(data!)

    return produtos
}

class func parserJson(data: NSData) -> Array<Produto> {

    if (data.length == 0) {
        println("NSData vazio")
        return []
    }

    var produtos: Array<Produto> = []

    // read JSON and convert to Dictionary
    var error: NSError?
    var dict: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary

    // read the structure Produtos and return a array with JSON content
    var jsonProdutos: NSDictionary = dict["produtos"] as NSDictionary
    var arrayProdutos: NSArray = jsonProdutos["produto"] as NSArray

    // Array produtos

    for obj:AnyObject in arrayProdutos {
        var dict = obj as NSDictionary
        var produto = Produto()
        produto.nome = dict["nome"] as String
        produto.desc1 = dict["desc1"] as String
        produto.desc2 = dict["desc2"] as String
        produtos.append(produto)
    }

    return produtos
}

}

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

JSONObject with data seems to return NIL, because the data may be invalid. Check the content of the error parameter!

As a solution, you should check the JSON datasource before reading from it. Use the NSJSONSerialization.isValidJSONObject member function.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...