2014-11-03 104 views
0

我有一个API返回的是这样的:无法转换JSON结果为结构

{ 
elements:[{ 
    name = "user1", 
    details =  { 
     phone = "0033612345678" 
    } 
}, 
{ 
    name = "user2", 
    details =  { 
     phone = "0033612346612" 
    } 
}, 
{ 
    name = "test3" 
}] 
} 

细节关键是不存在于每个元素

我已经定义了一个ElementModel.swift文件,我想为elements数组的每个元素创建一个ElementModel实例。

import Foundation 

struct ElementModel { 
    var name:String 
    var phone:String 
} 

为了获取名称和电话值,我创建了下面的函数,当正确执行的请求调用(使用delagation)

func getRequestSucceed(results: NSDictionary) { 
    println("getRequestSucceed") 

    // Loop through list of elements 
    let elementsArray = results["elements"] as NSArray 
    var elementsTmpArray:[ElementModel] = [] 

    // Convert each result into Element object 
    for var i=0;i<elementsArray.count;i++ 
    { 
     // Get NSDictionary from each element 
     let element = elementArray[i] as NSDictionary 

     // Create Element object with parameters from dictionary 
     var name = element["name"] as String 
     var phone:String = "" 

     // If details key exists, get phone attribute 
     if let details = element["details"] as? NSDictionary { 
      println(details["phone"]) // Phone number is correctly displayed 
      phone = details["phone"] as String // Simulator crash occurs the first time 
     } else { 
      println("Not defined") 
     } 

     // Create element model with name and phone 
     var t = ElementModel(name: name, phone: phone) 
     elementsTmpArray.append(t) 
    } 

    // Update table view 
    dispatch_async(dispatch_get_main_queue(), { 
     self.elements = elementsTmpArray 
     self.elementsTableView!.reloadData() 
    }) 
} 

这种方法行不通,似乎像细节[“电话”]不能以这种方式检索。我对swift非常陌生,并且不太了解Optional。只是想知道是否可选参与这个问题。
有什么想法?

+1

请在投票问题时添加注释,以便它可以帮助理解问题为什么不好或其他问题。 – Luc 2014-11-03 12:55:43

+0

我总是讨厌Downvote Drive-Bys ... 我也遇到类似的问题。为了解决这个问题,我必须对第一个对象进行硬编码,第一个对象包含一些数据,比如你称之为“元素”,但错误的是,如果你改变了这个哟[0],我确信它可能会起作用。至少它为我做了。我认为是Swift的一个bug。 – 2014-11-04 19:24:40

+0

顺便问一下,你忘了问,你甚至在调试时输入你的For循环?是NSArray显示为nil的数组let letArray = results [“elements”]? – 2014-11-04 19:28:58

回答

0
details["phone"] 

如果details是字典中,上述标表达式的类型是可选的(字典返回nil,如果有对应于下标没有元素),所以它不能被转换为字符串。您需要在演员表演之前解开结果至String

+0

phone = details [“phone”]!作为字符串给我同样的崩溃。 – Luc 2014-11-03 14:51:24

+0

@Luc'details [“phone”] as String?'should work,returned an optional string。请注意,您需要将该值保存为可选项,因为它显然可以是“nil”。您不能将其转换为非可选项。 – Sulthan 2014-11-03 14:56:41

+0

@Luc您需要检查返回的对象是否可以转换为字符串。 – JeremyP 2014-11-04 09:42:37