*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'
{
NSString *urlStr = [NSStringstringWithFormat:@"%@%@",DEVELOP_CIRCUMENT,URL_MEDIA_UPLOAD_COMPLETE];
NSString *jsonParam = [selfjsonFromDictionary:self.mediaPathdic];
jsonParam = [jsonParamstringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
jsonParam = [jsonParamstringByReplacingOccurrencesOfString:@"\\/"withString:@"/"];
[self.mediaPathdicsetObject:self.cerNoforKey:@"serno"];
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManagermanager];
sessionManager.requestSerializer = [AFJSONRequestSerializerserializer];
[sessionManager.requestSerializersetValue:self.tokenforHTTPHeaderField:@"Mgr"];
[sessionManager POST:urlStrparameters:jsonParam progress:nilsuccess:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject = %@", responseObject[@"res_info"]);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
NSLog(@"uploadAllMediaComplete请求错误, %@", error);
}];
}
其中jsonFromDictionary方法如下:
- (NSString *)jsonFromDictionary:(NSDictionary *)dic {
if ([NSJSONSerializationisValidJSONObject:dic]) {
NSError *error =nil;
NSData *data = [NSJSONSerializationdataWithJSONObject:dic
options:0
error:&error];
NSLog(@"error = %@", error);
return [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];
}
returnnil;
}
运行结果报错:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'
原因是:
sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
这句代码告诉AFN,上传的数据格式是 JSON格式,AFN 内部会帮我进行JSON 的转码,但是我们自己又先进行了转码。
两次转码会导致上面的错误:
解决办法只需要改成下面就可以了,其中self.mediaPathdic 是字典。
[sessionManager POST:urlStr parameters:self.mediaPathdic progress:nil success:^(NSURLSessionDataTask* _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject = %@", responseObject[@"res_info"]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"uploadAllMediaComplete 请求错误, %@", error);
}];