2015-04-03 94 views
-1

jsonResponse有兩個鍵,它的值不是實際值。無法解析json響應swift

代碼:statusDictionary

responseDictionary的
2 values 
{ 
    [0] = <error: use of undeclared identifier 'cocoarr' 
error: 1 errors parsing expression 
> 

    [1] = <error: use of undeclared identifier 'cocoarr' 
error: 1 errors parsing expression 
> 

結果的

var responseDictionary = jsonResponse as Dictionary<String, AnyObject> 
var statusDictionary = responseDictionary["status"] as Array<AnyObject> 

結果:

(lldb) po responseDictionary 
{ 
    [0] = { 
    key = "status" 
    value = (instance_type = Builtin.RawPointer = 0x00007fbb13dd0ee0 -> 0x0000000106aaf380 (void *)0x0000000106aaf3a8: __NSCFArray) 
    } 
    [1] = { 
    key = "lastRunTime" 
    value = (instance_type = Builtin.RawPointer = 0x00007fbb13dd0f70 -> 0x0000000106aae980 (void *)0x0000000106aae930: __NSCFString) 
    } 
} 

導致無法解析的值。

如果我做「po println(responseDictionary)」。我可以看到正確的結果。 解析有什麼問題?

感謝

+1

您尚未顯示任何代碼,您嘗試進行任何解析。不要太擔心調試器說什麼,它有時會產生虛假結果。 – rdelmar 2015-04-03 23:11:51

+0

你知道你的json有效嗎?你有沒有用在線驗證器檢查過它? – rdelmar 2015-04-03 23:32:12

+0

是的,這是一個有效的迴應。檢查http://json.parser.online.fr/ – selva 2015-04-03 23:36:56

回答

1

雨燕編程語言書上說

「使用類型轉換操作符(如)只有當你確信喪氣總是會成功的強制形式。如果您嘗試向下轉換到一個不正確的類類型的運營商的這種形式會觸發一個運行時錯誤「

摘自:蘋果公司‘雨燕程序設計語言’的iBooks。 https://itun.es/us/jEUH0.l

當您解析JSON並將其轉換爲本機Swift對象時,您不應該假設JSON的結構。您應該使用類型轉換運算符的安全形式,即可選表單。

使用單元測試(或遊樂場)是反序列化JSON時開始的好地方。請參閱下面的示例單元測試。

func testExample() { 
     var jsonString = "{" + 
     "\"lastRunTime\" : \"2004-05-06T14:13:55\"," + 
     "\"status\" : [" + 
     "\"finished\"," + 
     "\"processed\"" + 
     "]" + 
    "}"; 

     var jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true); 
     XCTAssertNotNil(jsonData); 

     if let jsonDataObject : NSData = jsonData { 
      var error : NSError?; 
      let options : NSJSONReadingOptions = NSJSONReadingOptions(); 

      var deserializedJson : AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonDataObject, options: options, error: &error); 

      XCTAssertNil(error); 
      if nil == error { 
       if let jsonDictionary = deserializedJson as? NSDictionary { 
        if let statusArray = jsonDictionary["status"] as? NSArray { 
         if let firstStatus = statusArray.firstObject as? String { 
          print(firstStatus); 

         } 
         else { 
          XCTFail("the status array should contain strings"); 
         } 
        } 
        else { 
         XCTFail("the json dictionary should contain a property whose name is status and whose value is an array"); 
        } 
       } 
       else { 
        XCTFail("json should have been deserialized to a dictionary at the highest level"); 
       } 
      } 
     } 

    } 

順便說一句,在使用Swift時不要過分依賴調試器。它不像Objective-C那樣清楚地報告對象值。

+0

很好的解釋。我已經解析了json對象和你一樣。事實是,正如調試人員所說,上面提到的「rdlmar」,它有時會產生虛假結果。現在我可以在處理null和nil值後解析。 – selva 2015-04-05 19:40:44

+0

謝謝,我很高興它幫助。你和rdlmar是對的。 – 2015-04-05 22:07:44