我从一个程序员团队接手了一个项目。我们的应用程序与服务器后端进行交互,我们已经开始自己进行操作,我在iOS端进行编程,并在服务器上成为了我的一个朋友。我们只想做一些小的改变。我们应用程序的一种方法是从公司的Intranet导入花名册,然后将其发送到解析后的服务器。除其他信息外,该花名册还存在于名为params的词典中。然后基本上以某种方式使用这两种方法将其发送到我们的服务器(该类是AFHTTPSessionManager的子类):
- (void)importListRosterWithParams:(NSDictionary *)params
withSuccess:(void (^)(NSURLSessionDataTask *task, id response))success
andFailed:(void (^)(NSURLSessionDataTask *task, NSError *error))failed {
[self POST:@"ImportListRoster" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
[FMWeatherManager sharedManager].needToUpdateWeather = YES;
success(task, responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
NSLog(@"%s API call failed with code: %ld",__FUNCTION__,(long)response.statusCode);
failed(task, error);
}];
}
-(NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
if ([parameters isKindOfClass:[NSDictionary class]]) {
parameters = [self addBaseParmsToDictionary:parameters forMethod:URLString];
}
__block NSString *urlString = URLString;
NSURLSessionDataTask *task = [super POST:URLString parameters:parameters success:^(NSURLSessionDataTask *task, NSDictionary *jsonDict) {
if ([self.tasksID containsObject:@(task.taskIdentifier)]) {
[self.tasksID removeObject:@(task.taskIdentifier)];
success (task, jsonDict);
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
NSLog(@"%s API call failed with code: %ld",__FUNCTION__,(long)response.statusCode);
if (error.code == -1003) {
[self.tasksID removeAllObjects];
if (![urlString isEqualToString:@"GetWeather"] && ![urlString isEqualToString:@"GetInvitations"]) {
UIAlertController *alert = [FMErrorAlertControllerFactory createAlertWithType:ERROR_MESSAGE_NOT_INTERNET_CONNECTION];
if ([UIApplication sharedApplication].keyWindow.rootViewController.presentedViewController) {
[[UIApplication sharedApplication].keyWindow.rootViewController.presentedViewController presentViewController:alert animated:YES completion:nil];
} else {
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}
}
failure(task, error);
} else if ([self.tasksID containsObject:@(task.taskIdentifier)]) {
[self.tasksID removeObject:@(task.taskIdentifier)];
failure(task, error);
}
}];
if(!self.tasksID) {
self.tasksID = [NSMutableArray array];
}
[self.tasksID addObject:@(task.taskIdentifier)];
return task;
}
我们必须在服务器上以及导致该服务器调用的方法中调整该公司的解析结构,因为它们已从简单的文本文件名册变为json名册。我在iOS端将此JSON字符串正确保存在字典中,而我的朋友在我们的服务器上正确设置了解析端。通过此方法传递到我们服务器的普通字符串,例如“ Hello world”,也将正确到达服务器上的相应方法。 JSON却没有,我们以某种方式在服务器上收到序列化错误。你知道为什么吗?如果我更深入地研究[super POST ...]的这些方法,由于我有限的iOS经验和理解,它会变得越来越混乱,我知道它们会进行一些序列化(我什至不完全知道它有什么用。 ..),但我不明白为什么字典中的简单JSON文本文件会引起问题,而简单的字符串却不会。知道我们如何解决这个问题?我什至不知道在哪里看……
编辑:这基本上是错误:
System.Runtime.Serialization.SerializationException:存在一个 反序列化类型Service.ImportListRoster的对象时出错。结束 来自名称空间“”的元素“ item”。找到元素'fromDate' 来自名称空间“”。 ---> System.Xml.XmlException:结束元素“ item” 来自名称空间“”。从名称空间中找到元素“ fromDate” ”。