2016-03-27 5 views
5

in Parsen Ich habe die folgende Klassekann nicht Wert vom Typ werfen ‚NSNull‘ auf ‚NSString‘ Json in schnellen

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; 
    } 
} 

, wenn ich den Code ausführen, bekam ich folgende Fehlermeldung

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

EDIT

do { 

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

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

          onFail() 
         } 
+0

Wie erhalten Sie dieses Wörterbuch? Analysieren Sie Ihren JSON mit 'NSJSONSerialization' oder einer anderen Bibliothek? –

+0

@DuncanC bitte überprüfen Sie meine Bearbeitung –

Antwort

19

Einer Ihrer data[SOME_KEY] vonTyp istanstelle von String und weil Sie den Cast auf String erzwingen, indem Sie ! verwenden, stürzt die App ab.

Sie können eines von zwei Dingen tun:

  1. Ihre Variablen auf der BannerResponse Klasse ändern optional zu sein. Und verwenden Sie ? anstelle von ! beim Festlegen der Werte in Ihrer init Methode. Wie folgt aus:

`

var title: String? 

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

oder

  1. Verwenden ? statt !, wenn die Werte in Ihrem init Verfahren einstellen, sondern setzen einen Standardwert, wenn dict[SOME_KEY] ist Null oder ist nicht der erwartete Typ. Dies würde in etwa so aussehen:

`

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" 

Und ich denke, eine dritte Sache ist sicher, dass der Server nie Nullwerte sendet nach unten. Aber das ist unpraktisch, weil es so etwas wie nie gibt. Sie sollten Ihren clientseitigen Code schreiben, um davon auszugehen, dass jeder Wert in JSON null oder ein unerwarteter Typ sein kann.

+0

Vielen Dank für Ihre Hilfe :) –

-1

Sie erhalten Nullwerte für einige Ihrer Schlüssel. Sie werden NSNull von NSJSONSerialization zugeordnet.

Sie müssen mehrere Dinge

ändern alle Variablen tun (url, contactNo, usw.) zu optionals:

var url:String? 
var contactNo:String? 

ändern alle Ihre Aufgaben ? statt ! zu verwenden:

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

Und schließlich, machen Sie Ihren Code behandeln keine Werte für alle Ihre Variablen. (Aber verwenden Sie nicht !. Dieser Pfad führt zu Abstürzen.)

+0

Vielen Dank für Ihre Hilfe :) –

+0

Dieser Schritt mit 'noNull' ist völlig unnötig. 'wie?String 'kann' NSNull' gut behandeln. – Sulthan

+0

Ich denke du hast Recht. –

Verwandte Themen