2017-09-02 4 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ページタグで応答を生成しました。 対象-c内の は、 で試行されました。id = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError]; NSDictionary * jsonDictionary = [NSDictionary new]; if([response isKindOfClass:[NSDictionary class]]){ jsonDictionary =レスポンス; } else { jsonDictionary = [レスポンスlastObject]; } すぐに問題をうまく解決できます。 – NishantK

+0

このようにしてみましたか? - もしresponseData = responseDataを? [[文字列:任意]] {} –

答えて

0

エラー(エラーを実際に調べることを指していますが、これを行わずに何人が質問をしたかは驚くべきことです)は、受け取ったデータが有効なJSONではないことを示しています。

あなたはhtmlタグで返信を受けていると言います。これは、サーバーコードが壊れているか、間違ったURLまたは不適切なパラメーターを使用していることを意味します。多くのサーバーは、JSONを返すように要求するとJSONを返し、それ以外の場合はHTMLを返すので、正しく質問する方法を見つけなければなりません。 (多くの場合、URLのバリエーションをブラウザに入力して調べることができます)。

私はあなたが.allowFragmentsを使用していることに気付きました。このオプションを使用すると、パーサーは辞書や配列だけでなく、文字列、数値、ブール値またはnullである「フラグメント」も解析できます。明らかにこれらの場合は、辞書や配列を取得しないので、フラグメントを期待し、それを処理する方法が分からない限り、このオプションを使用しないでください。

辞書または単一の辞書を含む配列のいずれかが必要です。 (私は空の配列か複数のディクショナリを含む配列を受け入れるかどうかを最初に尋ねるでしょう。はいの場合はコードを変更する必要があります)。私はすべてのエラーの場合にエラーを報告したいと思うでしょう。私はこのような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応答が生成されます。私はこれを解析することができる方法 は[{「データなし」::真、「ERROR_MESSAGE」「エラー」}]それは、このような 非JSON形式の応答を生成POSTMANに要求されたPOSTのURLを試してみましたか? – NishantK

関連する問題