Cocoa错误3840使用JSON(iOS)

ios*_*cks 38 cocoa-touch json objective-c ios

我正在尝试将数据发送到服务器并以JSON格式接收响应.问题是服务器必须返回"成功"或"失败",但它返回"(null)".

这是返回的错误:

Error Domain = NSCocoaErrorDomain Code = 3840"操作无法完成.(Cocoa error 3840.)"(JSON文本不是以数组或对象开头,而是选项允许未设置片段.)UserInfo = XXXXXXXXX {NSDebugDescription = JSON text没有从数组或对象和选项开始,以允许未设置片段.}

错误是否可能在服务器脚本中?

这是我发送数据并接收响应的函数:

- (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);
}
Run Code Online (Sandbox Code Playgroud)

小智 34

除非您将选项传递NSJSONReadingAllowFragments[NSJSONSerialization JSONObjectWithData:options:error:]服务器的响应,否则必须是有效的JSON,顶级容器是数组或字典.

例如:

    { "response" : "Success" }
Run Code Online (Sandbox Code Playgroud)

PS如果您想要一个可变字典,您还必须包含NSJSONReadingMutableContainers在您的选项中.

  • @Stu我无法使用或不使用NSJSONReadingAllowFragments来解决此问题 (2认同)

Van*_*hta 10

您的服务器响应可能不包含有效的JSON.

从技术上讲,JSON对象必须以"数组"或"对象(字典)"开头.

所以,无论你的服务器返回什么,都不是.

而且,无论使用NSJSONReadingAllowFragments选项,都可以强制使用JSON.

通过使用 ,

AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
Run Code Online (Sandbox Code Playgroud)