3

我已经阅读了很多关于这个问题的 Q/A,但找不到适合我情况的答案。

我从用 PHP 创建的 REST 服务检索 JSON 响应。这是我的代码:

NSURLResponse *response = nil;
NSError *theError1 = nil;
NSError *theError2 = nil;

NSURL *webServiceUrl = [NSURL URLWithString:@"http://..."];
NSURLRequest *request = [NSURLRequest requestWithURL:webServiceUrl cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
NSData *theData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&theError1];

NSString *dataString = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
NSLog(@"%@", dataString);

id json = [NSJSONSerialization JSONObjectWithData:theData options:NSJSONReadingAllowFragments | NSJSONReadingMutableContainers error:&theError2];
if (theError2 != nil)
    NSLog(@"%@", theError2);

当我在浏览器中调用 REST 调用时,我看到以下响应,这似乎与 XCode 记录的内容相同:

{
  "Name": "REST Service",
  "Product": "REST Test",
  "Version": "1.0.0.0",
  "Copyright": "2013 Test Company"
}

但是,当我执行上述代码时,会创建并记录以下错误:

错误域 = NSCocoaErrorDomain 代码 = 3840 “数据已损坏,无法读取。” (字符 3 周围的值无效。) UserInfo=0x100547430 {NSDebugDescription=字符 3 周围的值无效。}

我究竟做错了什么?

4

2 回答 2

1

好的,与往常一样,检查实际数据而不是字符串表示是值得的 - 感谢@Bavarious。

事实证明,负责创建 JSON 的 PHP 脚本都是“带有 BOM 的 UTF8”,因此 PHP 为每个涉及的脚本返回了一个 BOM。

一旦我将所有 PHP 文件更改为“没有 BOM 的 UTF8”,一切似乎都很好——不过需要在 MAC 上进行测试。

抱歉打扰了,继续努力。

(@Bavarious:如果您想写一个答案,我很乐意投票并接受它,因为您向我指出了解决方案)。


现在能够按预期解析 JSON。请注意始终仔细检查文本文件编码。

于 2013-09-03T08:54:55.870 回答
0
    NSURL *theURL = [NSURL URLWithString:@"http://yourdataurl"];

    NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
                       completionHandler:^(NSURLResponse *response,     NSData *data, NSError *connectionError) {
                               if (!connectionError) {
                                   NSError *error;

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

                                   NSData *theData = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

                                   NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:theData options:0 error:&error];


                                   if (!jsonResponse || error)
                                   {
                                       NSLog(@"Error");
                                   }
                                   else
                                   {
                                       // Everything is ok..
                                   }
                               }
                           }];
于 2015-05-31T18:49:21.490 回答