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. ダンは正しいです。エラーを確認する必要があります。を参照できますがerror.localizedDescription、必ずしも役立つとは限りません。error.code3840 を取得している可能性があり、error.userInfo辞書を見ると、「JSON テキストが配列またはオブジェクトで開始されておらず、フラグメントを許可するオプションが設定されていません」などの説明が表示される場合があります。

  3. への応答でエラーが発生するたびにJSONObjectWithData、データを確認する必要があります。したがって、 の前にJSONObjectWithData、次のことを行います。

    NSLog(@"%@", [[NSString alloc] initWithData:responseData
                                       encoding:NSUTF8StringEncoding]);
    
  4. これを行うと、データに JSON 文字列が含まれていないことに気付くかもしれません。認証の問題が発生する可能性があり、接続をより詳細に制御できるため、NSURLConnectionだけでなくを使用することをお勧めします。dataWithContentsOfURL次の正しい手順は、認証の問題の性質によって異なります。認証には、次の 2 つの基本的なタイプがあります。

    • チャレンジ/レスポンス認証: この種の認証があり、Web ブラウザーで JSON URL を取得した場合、ユーザーの資格情報を求めるポップアップ ウィンドウが表示されます。プログラム的に、 を書いた場合、didReceiveAuthenticationChallengeそれが呼び出されることがわかります。とにかく、これが認証のタイプである場合は、URL Loading System Programming GuideのAuthentication Challengesを参照してください。

    • HTML ベースの認証: (a) 応答が HTML ログイン ページである場合、これが事実であるかどうかを判断できます。または (b)willSendRequestリクエストがログイン ページにリダイレクトされたときにメソッドが呼び出された場合。この場合、これの正しい処理は、サーバー プログラマーが認証の問題をどのように処理したか、およびそれをどのように処理したいかによって少し異なります (たとえば、ユーザーに認証ページを表示しますか?以前に確立された資格情報を使用しますか?など)。

    その内容を見ればresponseData、問題は自明でしょう。HTML ログイン ページのようなものが表示された場合は、おそらく後者を扱っています。

于 2013-02-15T15:28:27.767 に答える