【问题标题】:TableView Json Swift表视图 Json 斯威夫特
【发布时间】:2015-08-16 11:26:46
【问题描述】:

我目前正在开发一个应用程序,它通过向 web 服务发出请求来列出用户对象,它以这种格式以 JSON 格式发送响应:

{
 "0":
 {
  "id":"30",
  "title":"galaxys6",
  "price":"550",
  "description":"neuf",
  "addedDate":"2015-07-16 15:04:24",
  "user_id":"2",
  "user_name":"",
  "user_zipCode":"69003",
  "category_id":"1",
  "category_label":"PHONE",
  "subcategory_id":"1",
  "subcategory_label":"Phone",
  "picture":"",
  "bdd":{},
  "picture_url":"http:\/\/jdl-barreme-orange.dyndns.org\/WEBSERVICE\/pictures\/galaxy s6.JPG"
 },
 "1":
 {
  "id":"31",
  "title":"iphone4",
  "price":"570",
  "description":"neuf",
  "addedDate":"2015-07-16 15:14:54",
  "user_id":"2",
  "user_name":"",
  "user_zipCode":"69003",
  "category_id":"1",
  "category_label":"PHONE",
  "subcategory_id":"1",
  "subcategory_label":"Phone",
  "picture":"",
  "bdd":{},
  "picture_url":"http:\/\/jdl-barreme-orange.dyndns.org\/WEBSERVICE\/pictures\/iphone.JPG"
 },
}

我的网络服务为每个对象创建一个字典 (0;1;2;3....)

我搜索了一个方法来为每个字典检索值标题和价格并将它们放在一个 tableView 中。

我使用的代码(tableviewcontroller):

if let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as? NSDictionary{

            // 4
             if let resp = jsonData["1"] as? [NSDictionary] {
                NSLog("%@", resp)
                // 5
                for item in resp {
                    repositories.append(Repository(jsonData: item))
                }

存储库控制器:

class Repository {

var name: String?
var description: String?
var html_url: String?

init(jsonData: NSDictionary) {
    self.name = jsonData["id"] as? String
    self.description = jsonData["description"] as? String
    self.html_url = jsonData["title"] as? String
}
}

但是不行,我放了一个断点,xcode在这里停下来解释:

if let resp = jsonData["1"] as? [NSDictionary] {
                NSLog("%@", resp)

我做错了什么?

谢谢。

【问题讨论】:

    标签: json swift tableview


    【解决方案1】:

    以下是获取 JSON 标题和价格的方法:

    if let json = NSJSONSerialization.JSONObjectWithData(urlData!, options: nil, error: nil) as? [String:AnyObject] {
        for (_, value) in json {
            if let dict = value as? [String:AnyObject] {
                if let title = dict["title"] as? String {
                    println(title)
                }
                if let price = dict["price"] as? String {
                    println(price)
                }
            }
        }
    }
    

    如果你愿意,这也可以用来初始化你的 Repository 类:

    class Repository {
    
        var name: String?
        var description: String?
        var html_url: String?
    
        init(jsonData: [String:AnyObject]) {
            self.name = jsonData["id"] as? String
            self.description = jsonData["description"] as? String
            self.html_url = jsonData["title"] as? String
        }
    }
    
    var repos = [Repository]()
    
    if let json = NSJSONSerialization.JSONObjectWithData(urlData!, options: nil, error: nil) as? [String:AnyObject] {
        for (_, value) in json {
            if let dict = value as? [String:AnyObject] {
                let repo = Repository(jsonData: dict)
                repos.append(repo)
            }
        }
    }
    
    for repo in repos {
        println(repo.name)
        println(repo.description)
        println(repo.html_url)
    }
    

    在循环中,我忽略了密钥:for (_, value) in json,但如果需要,您当然可以使用它:

    for (key, value) in json {
        println(key)  // "1", "2", ...
        // ...
    } 
    

    更新:

    在您的评论询问如果您的数据格式不同时如何使用此答案:如果您想要一个字典数组,请更改NSJSONSerialization 结果的类型转换以反映:[[String:AnyObject]]。接下来,您可以遍历数组以获取每个字典属性:

    if let jsonArray = NSJSONSerialization.JSONObjectWithData(urlData!, options: nil, error: nil) as? [[String:AnyObject]] {
        for dict in jsonArray {
            if let title = dict["title"] as? String {
                println(title)
            }
        }
    }
    

    【讨论】:

    • 最后一个问题,如果我的 JSON 中有类似的内容,可以使用此代码:{"objects":[{"id":"28","title":"test" ,"price":"56 ... 而不是 { "0": { "id":"30", "title":"galaxys6", "price":"550"... ?
    • 感谢您的解释,它更容易理解,但它不起作用,如果我在上面设置断点:“如果让 jsonArray = NSJSONSerialization.JSONObjectWithData(urlData!, options: nil, error: nil ) as? [[String:AnyObject]]" ,xcode 不执行下一个代码 "for dict in jsonArray" 再次感谢您与我在一起的时间!
    • 使用 jsonlint.com 测试您的实际 JSON 的有效性。我已经用你在评论中给出的例子检查了我的更新,它工作正常。如果仍然存在问题,那么也许是时候创建一个全新的问题,其中包含有关此特定新错误的详细信息。 :)
    • 是的,你是对的,关于信息,我的 JSON 是有效的,我只是想我必须修改我的代码以输入对象字段,然后检索我的每个对象的值。谢谢!
    【解决方案2】:

    你错了

    if let resp = jsonData["1"] as? [NSDictionary]
    

    这应该是NSDictionary 而不是[NSDictionary],(这将是一个字典数组)。

    还有这个条件块

    if let reposArray = jsonData["items"] as? [NSDictionary] 
    

    永远不会被执行,因为jsonData 不包含键“items”。

    【讨论】:

    • 我已经尝试过使用 NSDictionary 而不是 [NSDictionary],但我得到:“无法使用类型为 '(jsonData: (key: AnyObject, value: AnyObject ))'”。当然你是对的,这是一个错误,“if let reposArray = jsonData["items"] as? [NSDictionary]” 由其他控制器提供,对不起。
    • 好的,我们正在解决这个问题。首先对答案进行投票。
    【解决方案3】:

    我猜是[NSDictionary]

    if let resp = jsonData["1"] as? [NSDictionary]
    

    [NSDictionary] 是 NSDictionary 的数组,与 Array<NSDictionary> 相同 只需删除括号 [] 并更改为

    if let resp = jsonData["1"] as? NSDictionary
    

    【讨论】:

    • 我已经尝试过使用 NSDictionary 而不是 [NSDictionary],但我得到:“无法使用类型为 '(jsonData: (key: AnyObject, value: AnyObject ))'"。
    猜你喜欢
    • 2023-03-07
    • 2017-02-15
    • 2017-07-22
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多