こんにちは私はiOSの新人で、JSONを使用してWebサービスから応答を取得しようとしていますが、次のエラーが発生します。それを解決するのを手伝ってください。
エラードメイン= NSCocoaErrorDomainコード= 3840 "操作を完了できませんでした。(Cocoaエラー3840。)"(JSONテキストが配列またはオブジェクトで開始されておらず、フラグメントを許可しないオプションが設定されていません。)UserInfo = 0x7fd30bee0f70 {NSDebugDescription = JSON text配列またはオブジェクトで開始されておらず、フラグメントを設定できないようにするオプションがありません。、NSUnderlyingError = 0x7fd30bede7b0 "リクエストが失敗しました:内部サーバーエラー(500)"}
-(void)loadFeedWithOffset:(NSInteger)Offset Limit:(NSInteger)Limit
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// [manager.requestSerializer setValue:@"application/json; text/html" forHTTPHeaderField:@"Accept"];
// [manager.requestSerializer setValue:@"application/json; text/html; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"UID"] forKey:@"user_id"];
[params setValue:[NSString stringWithFormat:@"%ld",(long)Offset] forKey:@"offset"];
[params setValue:[NSString stringWithFormat:@"%ld",(long)Limit] forKey:@"limit"];
[params setValue:[NSString stringWithFormat:@"%d",[AppDelegate sharedAppDelegate].intPostType] forKey:@"post_type"];
[manager POST:[NSString stringWithFormat:@"%@webservices/post/load", API_URL] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", responseObject);
if ([[responseObject objectForKey:@"status"] isEqualToString:@"fail"])
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:[responseObject objectForKey:@"message"] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
alert = nil;
}
else
{
if ([[responseObject objectForKey:@"feed"] count] > 0)
{
isOver = FALSE;
[arrFeed addObjectsFromArray:[responseObject objectForKey:@"feed"]];
searchedDataArray = [NSMutableArray arrayWithArray:arrFeed];
//searchedDataArray=arrFeed;
[tblMenuDetail reloadData];
}
else
{
isOver = TRUE;
}
[self performSelector:@selector(doneLoadingTableViewData) withObject:self afterDelay:1.0];
}
[[AppDelegate sharedAppDelegate] hideProgress];
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
[[AppDelegate sharedAppDelegate] hideProgress];
NSLog(@"Error: %@", error);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
alert = nil;
}];
}
これは通常、バックエンドに関連する問題であり、jsonは適切にフォーマットされておらず、クライアント側でそれに対してできることは何もありません....
間違ったパラメーターがバックエンドに送信されたときにこれが発生することがありますが、すべてのパラメーターが正しいかどうかを確認できます(タイプと値の両方)
私はAFNetworkingで同じ問題を抱えていました。これは、サーバーからの応答にJSON辞書や配列ではなく文字列が保持されているためです。だから私は以下のコード行を追加して修正しました
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
それもあなたのために働くことを願っています。ではごきげんよう:)
content-type
としてjson
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
私は同じ問題を抱えています、サーバーから暗号化された応答を受け取っています、私がしたことは問題を解決しました。
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
試してみる。
このエラーは、URLに十分な欠陥がなく、APIがエラーまたは不適切な応答を返す場合にも発生する可能性がありますが、APIが気に入らない奇妙な何かを含むエラーが発生しています。例えば:
例1:appendingPathExtension( "。json")は余分な不要な ".."ピリオドを追加する可能性があります。bcこのメソッドはすでに 'ドットを追加しています。
例2:URLは、URLQueryItemクラスと.queryItemsメソッドを使用する以外のメソッドを介して、クエリをurl/stringとして追加することによって構築されました。 Swift 5では、これにより、リクエストの「?」が別のシンボルになるか、APIがapiKeyまたはqueryItemをすべて見落とす可能性があります。したがって、リクエストの例で「?」が表示されている場所URL、queryItemsを必ず使用してください(ドキュメントを参照)。
これは、最後のapi_keyである単一のクエリ項目を含む、正常なURL構築の例です...
let heirarchyURL = baseURL.appendingPathComponent("league").appendingPathComponent("hierarchy").appendingPathExtension("json")
var components = URLComponents(url: heirarchyURL, resolvingAgainstBaseURL: true)
let keyQuery = URLQueryItem(name: "api_key", value: apiKey)
components?.queryItems = [keyQuery]
guard let url = components?.url else {
NSLog("components of url failed to load properly")
completion()
return
}
print("fetch URL: \n\(url)\n")
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { (data, _, error) -> Void in
これはJSONSerialization
またはSwiftエラーではありません。ではありません。
問題は応答の解析にあります。 JSON応答(Array
またはDictionary
のいずれかに含まれている必要があります)を逆シリアル化しようとしていますが、応答は上記のいずれでもありません(おそらく単純な文字列)。
このコードを試してサーバーデータを印刷し、エラーを簡単に特定して解決してください。
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let jsonData = data {
do {
let parsedData = try JSONSerialization.jsonObject(with: jsonData, options: []) as! [String: AnyObject]
}
catch let err{
print("\n\n===========Error===========")
print("Error Code: \(error!._code)")
print("Error Messsage: \(error!.localizedDescription)")
if let data = data, let str = String(data: data, encoding: String.Encoding.utf8){
print("Print Server data:- " + str)
}
debugPrint(error)
print("===========================\n\n")
debugPrint(err)
}
}
else {
debugPrint(error as Any)
}
}.resume()
私もこの問題を抱えていますが、この問題がサーバー側またはバックエンドにあることを確認したい場合は、postmanを使用してWebサービスにアクセスし、RawセクションまたはPreviewセクションで応答を確認してください。これらのセクションは、Webサービスを使用して取得する正確な応答を示しています。プレビューセクションには、正確な情報/行番号、関数名などの問題が表示されます.
私の場合、.jsonobjectオプションを設定します:arrayとして、このエラーが発生します。
let response = try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject]
これはここに私のコードです[]オプションを送信し、後でarrayから.allowFragmentsに変更しました
私の解決策は...
let response = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: AnyObject]
ここに解決策があります、以下のコードを使用してください、それは動作します:
//注:JSONを使用するWebサービス
NSString *strAPIURL = [NSString stringWithFormat:@"%@webservices/post/load", API_URL];
NSDictionary* dictHeader = @{@"content-type": @"application/json"}; //You can add here more header field if require, like "Authorization"
NSMutableDictionary *params = [NSMutableDictionary dictionary];
[params setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"UID"] forKey:@"user_id"];
[params setValue:[NSString stringWithFormat:@"%ld",(long)Offset] forKey:@"offset"];
[params setValue:[NSString stringWithFormat:@"%ld",(long)Limit] forKey:@"limit"];
[params setValue:[NSString stringWithFormat:@"%d",[AppDelegate sharedAppDelegate].intPostType] forKey:@"post_type"];
NSData *postData = [NSJSONSerialization dataWithJSONObject:params options:0 error:nil];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strAPIURL]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];
[request setHTTPMethod:@“POST”];
[request setAllHTTPHeaderFields:dictHeader];
[request setHTTPBody:postData];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@",responseObject);
//Success code…
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//Failure code…
}];
[operation start];
return operation;