web-dev-qa-db-ja.com

iOS 5 JSON解析の結果、Cocoaエラー3840が発生する

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.)

私はこれを明確に修正することができないので、これに関するいくつかの助けに感謝します。

30
Gup3rSuR4c

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

[[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"\}]\}]\}}

thatをデータとして読み取り、それをJSONとして解析しようとすると、3840エラーが表示されます。そのエラーの説明は次のとおりです。

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

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

22
Dave DeLong

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

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

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

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

詳細については、この記事をお読みください。わたしにはできる

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

11
nebitrams

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."];
}
10
kraftydevil

RTFではなくJSONが原因でここに到着した場合は、この回答を確認してください。 IOS JSONデシリアライゼーションの失敗-STIG/NSJSONSerializer

1
James Roeiter