2016-03-27 69 views
5

解析JSON铸铅字“NSNull”到“的NSString”的价值我有下面的类无法在迅速

class BannerResponse : NSObject{ 

    let URL    = "Url"; 
    let CONTACT_NO   = "ContactNo"; 
    let IMAGE    = "Image"; 
    let BIG_IMAGE   = "BigImage"; 
    let ID     = "Id"; 
    let TITLE    = "Title"; 
    let NO_VIEW   = "NoView"; 
    let START_DATE   = "StartDate"; 
    let END_DATE   = "EndDate"; 


    var url:String; 
    var contactNo:String; 
    var image:String; 
    var bigImage:String; 
    var title:String; 
    var id:Int; 
    var noView:Int; 
    var startDate:String; 
    var endDate:String; 

    init(data : NSDictionary){ 

     url   = data[URL] as! String; 
     contactNo = data[CONTACT_NO] as! String; 
     image  = data[IMAGE] as! String; 
     bigImage = data[BIG_IMAGE] as! String; 
     title  = data[TITLE] as! String; 
     id   = data[ID] as! Int; 
     noView  = data[NO_VIEW] as! Int; 
     startDate = data[START_DATE] as! String; 
     endDate  = data[END_DATE] as! String; 
    } 
} 

当我运行的代码,我得到了以下错误

Could not cast value of type 'NSNull' (0x10a85f378) to 'NSString' (0x109eccb20). 

编辑

do { 

          if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary{ 

           onSuccess(BannerResponse(data: json)) 
          } 
         } catch { 

          onFail() 
         } 
+0

你是如何得到这本词典的?你是使用'NSJSONSerialization'还是其他一些库来解析你的JSON? –

+0

@DuncanC请检查我的编辑 –

回答

19

你的一个data[SOME_KEY]的是类型而不是String,因为您使用!强制转换为String该应用程序崩溃。

你可以做两件事情之一:

  1. 变化对BannerResponse类的变量是可选的。在设置init方法中的值时,使用?而不是!。像这样:

`

var title: String? 

init(data: NSDictionary) 
{ 
    self.title = data[TITLE] as? String 
} 

init方法设定的值时
  • 使用?代替!但设置的默认值,每当dict[SOME_KEY]为零或不是预期的类型。这将是这个样子:
  • `

    if let title = data[TITLE] as? String 
    { 
        self.title = title 
    } 
    else 
    { 
        self.title = "default title" 
    } 
    
    // Shorthand would be: 
    // self.title = data[TITLE] as? String ?? "default title" 
    

    我猜第三件事是确保服务器永远不会降下空值。但这是不切实际的,因为从来没有这样的事情。您应该编写客户端代码,以假定JSON中的每个值都可以为null或意外类型。

    +0

    非常感谢您的帮助:) –

    -1

    您正在为您的某些密钥获取空值。它们通过NSJSONSerialization映射到NSNull。

    你需要做几件事情

    更改所有变量(urlcontactNo等),以选配:

    var url:String? 
    var contactNo:String? 
    

    更改所有分配使用?而不是!

    url = noNulls[URL] as? String 
    contactNo = noNulls[CONTACT_NO] as? String 
    

    最后,让你的代码处理所有变量的nil值。 (但不要使用!。该路径导致崩溃。)

    +0

    非常感谢您的帮助:) –

    +0

    使用'noNull'的步骤完全没有必要。 '作为?String'可以很好地处理'NSNull'。 – Sulthan

    +0

    我想你是对的。 –