我正在尝试将数据发送到服务器并以JSON格式接收响应。问题是服务器必须返回“成功”或“失败”,但它返回“(null)”。
这是返回的错误:
错误域= NSCocoaErrorDomain代码= 3840“操作不能 完成。 (可可错误3840.)“(JSON文本没有以数组或 允许片段未设置的对象和选项。)UserInfo = XXXXXXXXX {NSDebugDescription = JSON文本不是以数组或对象开头的 允许片段未设置的选项。}
错误是否可能在服务器脚本中?
这是我发送数据和接收响应的功能:
- (void) putData:(NSString *)parameter valor:(NSString *)valor {
NSString *rawString = [NSString stringWithFormat:@"%@=%@", parameter, valor];
NSData *data = [rawString dataUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:@"http://www.xxx.xxx/xxx.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"PUT"];
[request setHTTPBody:data];
NSURLResponse *response;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
NSLog(@"responseData: %@ error: %@", json, error);
}
答案 0 :(得分:34)
除非您将选项NSJSONReadingAllowFragments
传递给[NSJSONSerialization JSONObjectWithData:options:error:]
,否则来自服务器的响应必须是有效的JSON,顶级容器是数组或字典。
例如:
{ "response" : "Success" }
P.S。
如果您想要一个可变字典,您还必须在选项中包含NSJSONReadingMutableContainers
。
答案 1 :(得分:9)
服务器的响应可能不包含有效的JSON。
从技术上讲,JSON对象必须以“数组”或“对象(字典)”开头。
所以,无论你的服务器返回什么,都不是。
而且,无论使用NSJSONReadingAllowFragments选项,都可以强制使用JSON。
使用,
AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
答案 2 :(得分:1)
如果您在iOS设备上连接到VPN,则可能会遇到此问题。