2017-09-02 44 views
0

每次我得到一個錯誤:如何檢查URLSessionDataTask響應數據是數組還是字典?

jsonError::Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 1." UserInfo={NSDebugDescription=Invalid value around character 1.}

let dataTask: URLSessionDataTask = session.dataTask(with: urlRequest as URLRequest) { (data:Data?, response:URLResponse?,error: Error?) in 
    if((error) != nil){ 
     completionHandler(false, nil, error) 
    } 
    else{ 
     do { 
      let responseData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) 

      if responseData is Dictionary<String, Any>{ 
       print("dictionary type") 
      } 
      else if responseData is Array<Any>{ 
       print("array type") 
      } 
     } 
     catch let jsonError { 
      print("jsonError::\(jsonError)") 
      completionHandler(false, nil, jsonError) 
     } 

    } 


} 

dataTask.resume(); 

請建議。提前致謝。

+0

它看起來像數據是無效的JSON。嘗試記錄數據和/或轉換爲字符串的數據。 –

+0

@KenThomases響應字符串生成的HTML頁面標籤響應。 任何替代? 在objective-c試用 id response = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError]; NSDictionary * jsonDictionary = [NSDictionary new]; if([response isKindOfClass:[NSDictionary class]]){ jsonDictionary = response; } else { jsonDictionary = [response lastObject]; } 在swift中工作正常。 – NishantK

+0

你有沒有試過這樣的: - 如果讓responseData = responseData爲? [[字符串:任何]] {} –

回答

0

錯誤(指向您實際檢查錯誤,令人驚訝的是有多少人在沒有這樣做的情況下提出問題)告訴您,您收到的數據根本無效。

你說你正在收到一個html標籤的響應。這意味着服務器代碼被破壞,或者使用不正確的URL或不正確的參數。如果您要求他們返回JSON,許多服務器將返回JSON,否則將返回HTML,因此您只需要弄清楚如何正確詢問。 (通常,您只需在瀏覽器中輸入URL的變體即可)。

我注意到你使用了.allowFragments。此選項允許解析器不僅解析字典和數組,而且解析「片段」,即字符串,數字,布爾值或空值。很明顯,在這些情況下,你不會得到一個字典或數組,所以不要使用這個選項,除非你期望一個片段並知道如何處理它。

看來你期望的是一個字典或一個包含單個字典的數組。 (我會問第一個空數組還是包含多個字典的數組是否可以接受,如果是,那麼你需要更改代碼)。我假設你想在所有錯誤情況下報告錯誤。我會寫這樣的dataTask完成處理程序(由你來編譯)

guard error == nil else { 
    handle error 
    return 
} 

guard data != nil else else { 
    handle error 
    return 
} 

guard let parsed = try? JSONSerialization.jsonObject (...) else { 
    handle error 
    return 
} 

if let dict = parsed as? [String: Any] { 
    handle result dict 
    return 
} 

guard let array = parsed as? [Any] else { 
    handle error 
    return 
} 

guard array.count == 1 else { 
    handle error 
    return 
} 

if let dict = array [0] as? [String: Any] { 
    handle result dict 
} else { 
    handle error 
} 
+0

當數據轉換爲字符串時,會生成HTML響應。 在POSTMAN上嘗試請求的POST網址,它生成的響應爲 非JSON格式,如[{「Error」:true,「Error_Message」:「無數據可用」}] 我該如何解析? – NishantK

相關問題