我在这个问题上读了很多Q / As,但找不到适合我情况的答案。
我从我在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"
}
但是,当我执行上面的代码时,会创建并记录以下错误:
Error Domain = NSCocoaErrorDomain Code = 3840“无法读取数据,因为它已损坏。” (字符3周围的值无效。)UserInfo = 0x100547430 {NSDebugDescription =字符3周围的值无效。}
我做错了什么?
答案 0 :(得分:1)
好的,一如既往,检查实际数据而不是字符串表示支付 - 谢谢@Bavarious。
事实证明,负责创建JSON的PHP脚本都是“带BOM的UTF8”,因此PHP为每个涉及的脚本返回了一个BOM。
一旦我将所有PHP文件更改为“没有BOM的UTF8”,一切似乎都很好 - 需要在MAC上测试这个。
抱歉中断,保持良好的工作。
(@ Bavarious:如果你想写一个答案,我很乐意接受投票并接受它,因为你指出了我的解决方案。)
能够按预期解析JSON。做一个心理记录,总是仔细检查文本文件编码。
答案 1 :(得分: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..
}
}
}];