2017-09-02 65 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

相关问题