您好,我是iOS的新手,我正在尝试使用JSON从Web服务获得响应,但发生以下错误。请帮我解决一下。
错误域= NSCocoaErrorDomain代码= 3840"操作不能 完成。 (可可误差3840。)" (JSON文本不是从数组开始的 允许片段未设置的对象和选项。)UserInfo = 0x7fd30bee0f70 {NSDebugDescription = JSON文本不是以数组或对象开头的 允许片段未设置的选项。,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;
}];
}
答案 0 :(得分:8)
这通常是一个与后端相关的问题,json格式不合理,在客户端没有什么可以做的....
虽然有时会在向后端发送错误参数时发生这种情况,因此您可以检查所有参数是否正确(类型和值)
答案 1 :(得分:2)
尝试将content-type
设为json
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
答案 2 :(得分:2)
我遇到了与AFNetworking相同的问题,这是因为你来自服务器的响应是持有字符串而不是JSON字典或数组。所以我通过添加以下代码行来修复它
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
希望它也适合你。一切顺利:)
答案 3 :(得分:0)
这是解决方案,使用下面的代码,它将起作用:
//注意:使用JSON的Web服务
addEvent(){
this.buttonColor = '#345465'; //desired Color
/*
YOUR FUNCTION CODE
*/
}
答案 4 :(得分:0)
我遇到了同样的问题,我从服务器获得加密响应,我所做的解决了这个问题。
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
试一试。
答案 5 :(得分:0)
我也有这个问题,但如果您想确保此问题来自服务器端或后端,请尝试使用邮递员点击Web服务并检查Raw部分或预览部分中的响应。这些部分显示了我们使用Web服务获得的确切响应。预览部分显示确切的信息/问题,如行号,功能名称等。
答案 6 :(得分:0)
这不是JSONSerialization
或快速错误。
问题来自响应解析。您正在尝试反序列化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: .mutableLeaves) 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()
答案 7 :(得分:0)
在我的情况下,我将.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]
答案 8 :(得分:0)
如果您的网址不够错误,无法使api返回错误或错误的响应,但是错误中包含了api不喜欢的内容,则也会发生此错误。例如:
示例1: appendingPathExtension(“。json”)可能会增加一个多余的“ ..”时期,因为此方法已经为您添加了'。
示例2: 通过使用除URLQueryItem Class和.queryItems方法以外的方法将查询添加为url / string来构造url。在Swift 5中,这可能会导致“?”在您要求使用其他符号的情况下,或者让api一起丢失了apiKey或queryItem。所以在任何地方看到“?”在示例请求网址中,请确保使用queryItems(请参阅文档)。
这是成功构建URL的一个示例,其中包括一个查询项,该查询项的最后是api_key ...
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