2

我一直在开发应用程序,它对 JSON 类型的数据发出异步请求。最近,我在我的代码中发现了一个奇怪的错误,我不知道为什么会这样。

好的代码!

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

NSError *error=nil;

    result = [NSJSONSerialization JSONObjectWithData:retrievedData options:kNilOptions error:&error];
        NSLog(@"Result %@",result);
        NSLog(@"Retrieved data %@",retrievedData);
}

结果是 NSDictionary,retrieveedData 是 NSMutableData。99% 的时间,它工作正常,connectionDidFinishLoading 被调用,我的结果被填充。但是,在那 1% 的时间里,检索到的数据被数据填充,但我的结果为空。(如您在图片上看到的那样。有人可以帮我吗?

日志

编辑:我收到以下错误

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.) UserInfo=0x753e5c0 {NSDebugDescription=Garbage at end.}
4

4 回答 4

3

如果你先看一下错误,看看它是否给出了错误的任何迹象,这将有所帮助。

[编辑]
您的错误提到了原因:Garbage at end..

来自网络服务器的响应不是有效的 JSON,它在输出末尾包含无效字符。

于 2013-01-24T10:46:29.887 回答
2

我遇到过同样的问题。首先,看看什么是未正确解析的数据 - 就我而言,我做了

NSString *str = [[NSString alloc] initWithData:retrievedData encoding:NSUTF8StringEncoding];

在我的情况下,原因是 - 如果服务器连续发送了几个 socket.write() - 所有数据都是在一个块中接收的,比如

{first:json}{second:json}..

当然这不能被解析为一个单独的 json,所以我必须引入分隔符,并将接收到的缓冲区拆分为正确的块。

于 2013-09-06T08:37:55.840 回答
1

这有点晚了,但在我这样做之前,没有任何在线工作对我有用:

NSString * dataInString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

NSRange range = [dataInString rangeOfString:@"}" options:NSBackwardsSearch];

if(range.location != NSNotFound)
    dataInString = [dataInString substringWithRange:NSMakeRange(0,range.location+1)];

从那以后一直工作。

于 2014-08-11T09:42:19.437 回答
0

我有同样的错误,问题是我的服务器在我的 json 响应中附加了一些额外的行,当我在浏览器中获得响应时不会出现。从终端使用 curl,您可以看到实际输出。黑客是截断多余的字符。使用 json 你有一个数组或字典。根据您的 json 结构,您可以使用代码(如上面的答案)但在第 2 行中查找注释

NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSRange range = [str rangeOfString:@"}" options:NSBackwardsSearch]; // } for dictionary, ] for array

if(range.location != NSNotFound)
str = [str substringWithRange:NSMakeRange(0,range.location+1)];

从垃圾数据中清除字符串后,您可以再次将其转换为数据。

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

现在从这些数据中你可以得到你的数组或字典。

id jsonObject = [NSJSONSerialization
                 JSONObjectWithData:data
                 options:kNilOptions error:&error];  // i used id to be general, you can use array or dictionary structure or later cast this object to as per json
于 2014-11-23T09:00:21.980 回答