30

iOS 5 で以下の JSON 文字列を解析するのに苦労しています。

{"States": [{"Name": "Arizona","Cities": [{"Name": "Phoenix"}]},{"Name": "California","Cities": [{"Name": "Orange County"},{"Name": "Riverside"},{"Name": "San Diego"},{"Name": "San Francisco"}]},{"Name": "Nevada","Cities": [{"Name": "Las Vegas"}]}]}

そして、ここに私のコードがあります:

- (void) parseJson {
NSError *jsonError = nil;
NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"]];

if (jsonData) {
    NSDictionary *jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];

    if (jsonError) {
        NSLog(@"JSON Error: %@", [jsonError localizedDescription]);

        return;
    }

    NSLog(@"%@", jsonObjects);
}
}

このエラーが発生し続けます:

JSON Error: The operation couldn’t be completed. (Cocoa error 3840.)

私は明らかにこれを修正することができないので、これについての助けをいただければ幸いです。

4

4 に答える 4

23

私が間違っていると思うことの1つはこれです:

[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"]

あなたのデータはRTFファイルですか?? txtファイル (またはその他の種類のプレーン テキスト ファイル) である必要があります。通常、RTF ファイルには、次のようなテキスト形式のデータが含まれています。

{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural

\f0\fs24 \cf0 \{"States": [\{"Name": "Arizona","Cities": [\{"Name": "Phoenix"\}]\},\{"Name": "California","Cities": [\{"Name": "Orange County"\},\{"Name": "Riverside"\},\{"Name": "San Diego"\},\{"Name": "San Francisco"\}]\},\{"Name": "Nevada","Cities": [\{"Name": "Las Vegas"\}]\}]\}}

それをデータとして読み込んJSON として解析しようとすると、表示されている 3840 エラーが発生します。そのエラーの説明には次のように書かれています:

データが破損しているため、データを読み取ることができませんでした。(文字 2 の周りのオブジェクトの値の文字列キーはありません。)

つまり、実際には JSON を持っていないように見えます。RTF データがあります。

于 2012-06-24T00:50:48.380 に答える
11

私は同様の問題に遭遇しました。サーバーから JSON データをダウンロードすると、JSON パーサーが断続的に動作します。この関数から JSON データを取得しましたか?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

この関数から返される NSData は、部分的なデータである可能性があります。次のタイプのインスタンス変数に appendData を追加する必要があります: NSMutableData. 次に、JSON を別の関数で次のように処理します。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

詳細はこの記事を読んでください。わたしにはできる

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

于 2012-08-28T15:01:32.923 に答える
10

NSDataオブジェクトをNSString次のように変換することで、JSON 3840 エラーのトラブルシューティングを行うことができました。

NSError *error;

NSObject *object = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

if (object == nil) {
    NSString *serverResponse = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];

    NSLog(@"\n\nError:\n%@\n\nServer Response:\n%@\n\nCrash:", error.description, serverResponse);
    [NSException raise:@"Invalid Data" format:@"Unable to process web server response."];
}
于 2014-10-06T06:51:10.013 に答える
1

RTF ではなく JSON が原因でここにたどり着いた場合は、次の回答を確認してください: IOS JSON Deserialization failure - STIG/NSJSONSerializer

于 2012-07-22T00:25:14.927 に答える