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"
}

ただし、上記のコードを実行すると、次のエラーが作成されてログに記録されます。

エラー Domain=NSCocoaErrorDomain Code=3840 「データが破損しているため、データを読み取ることができませんでした。」(文字 3 付近の値が無効です。) UserInfo=0x100547430 {NSDebugDescription=文字 3 付近の値が無効です。}

私は何を間違っていますか?

4

2 に答える 2

1

OK、いつものように、文字列表現の代わりに実際のデータをチェックすることで報酬が得られます - @Bavarious に感謝します。

JSON の作成を担当する PHP スクリプトはすべて「BOM 付きの UTF8」であったため、PHP は関連するすべてのスクリプトに対して BOM を返しました。

すべての PHP ファイルを「BOM なしの UTF8」に変更すると、すべて問題ないように見えますが、MAC でこれをテストする必要があります。

中断して申し訳ありませんが、良い仕事を続けてください。

(@Bavourious:答えを書きたい場合は、解決策を教えてくれたので、喜んで賛成して受け入れます)。


期待どおりに 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 に答える