0

这是我解析 json 服务的代码。但是我在 json 字典中得到了 nil 值。但是当我复制 json 响应并制作一个 .txt 文件并解析它时。它运作良好。奇怪的问题。

-(void)viewDidLoad
{
    [super viewDidLoad];

    dispatch_async(kBgQueue, ^{
        NSData* data = [NSData dataWithContentsOfURL:@"http://www.checker.co.il/testing/c_pda-load_reports_list.php?app=1"];
        [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
    });
}

- (void)fetchedData:(NSData *)responseData {
    //parse out the json data
    NSError* error;
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData //1
                                                         options:kNilOptions 
                                                           error:&error];
}

这种类型的反应,我得到了。

{"204281":{"rpID":"204281","ReportTitle":"Main Performance 
Analysis","ReportOrder":"2","URL":"report-network-status.php?ClientID=106&BranchID=&SetID=&
PropID=&props=&reportDateArng=3&hdrf_chosenCycleExtent=7&rangeStartd=0&rangeStartm=0&
rangeStarty=0&rangeEndd=0&rangeEndm=0&rangeEndy=0&pastDateCyclesNumber=2&selectedCycleExtent=&
showClientColorGroup=1&displayType=3&DyChartType=Bar2D&DycX=400&DycY=350&isPopup=0&
callingReportPageName=report-network-status.php&ReportTitle=\"%20
\"","ReportCategory":"Performance","CategoryRow":"0","CategoryCol":"4"},"204282":
{"rpID":"204282","ReportTitle":"Performance According to 
Ownership","ReportOrder":"5","URL":"report-property.php?ClientID=106&SetID=&PropID=78&
PropForFiltering=&props=&WorkerID=0&watchedReviews=&reportDateArng=1&hdrf_chosenCycleExtent=&
rangeStartd=0&rangeStartm=0&rangeStarty=0&rangeEndd=0&rangeEndm=0&rangeEndy=0&
pastDateCyclesNumber=2&selectedCycleExtent=&displayType=3&DyChartType=Column2D&DycX=400&DycY=250&
callingReportPageName=report-property.php&js_refresh=0&js_submit=0&
isPopup=0","ReportCategory":"Performance","CategoryRow":"0","CategoryCol":"4"}}

提前致谢。:)

4

1 回答 1

1
  1. dthien 是对的,您需要使用NSURL.

  2. danh 是对的,您应该查看错误。您可以查看error.localizedDescription,但这并不总是有帮助。您可能会得到error.code3840,如果您查看error.userInfo字典,您可能会看到类似“JSON 文本未以数组或对象开头以及允许未设置片段的选项”之类的描述。

  3. 每当您对 的响应出现错误时JSONObjectWithData,您都应该查看数据。因此,在 之前JSONObjectWithData,请执行以下操作:

    NSLog(@"%@", [[NSString alloc] initWithData:responseData
                                       encoding:NSUTF8StringEncoding]);
    
  4. 当您这样做时,您可能会注意到数据不包含 JSON 字符串。您可能遇到身份验证问题,并且您可能想要使用 aNSURLConnection而不仅仅是dataWithContentsOfURL,因为前者可以让您更详细地控制连接。正确的后续步骤取决于身份验证问题的性质。有两种基本的身份验证类型:

    • 质询-响应身份验证:如果您进行了此类身份验证,并且在 Web 浏览器中提取了 JSON URL,您会看到一些弹出窗口,要求您提供用户凭据。以编程方式,如果你写了一个didReceiveAuthenticationChallenge,你会看到它会被调用。无论如何,如果这是您的身份验证类型,请参阅URL 加载系统编程指南中的身份验证挑战。

    • 基于 HTML 的身份验证:如果 (a) 您的响应是 HTML 登录页面,您可以判断是否是这种情况;或 (b) 如果您的willSendRequest方法在您的请求被重定向到登录页面时被调用。如果是这种情况,正确的处理方式在一定程度上取决于服务器程序员如何处理身份验证问题,以及您希望如何处理它(例如,您想向用户显示身份验证页面吗?您想使用一些以前建立的凭据?等)。

    如果你看那个的内容,responseData问题就会不言而喻。如果你得到一个看起来像 HTML 登录页面的东西,那么你可能正在处理后者。

于 2013-02-15T15:28:27.767 回答