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.)
私はこれを明確に修正することができないので、これに関するいくつかの助けに感謝します。
私が間違っていると思うのはこれです:
[[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データがあります。
私は同様の問題に直面していました。サーバーからJSONデータをダウンロードすると、JSONパーサーが断続的に動作します。この関数からJSONデータを取得しましたか?
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
この関数から返されるNSDataは部分的なデータである可能性があります。タイプがNSMutableDataのインスタンス変数にDataを追加する必要があります。次に、次のように別の関数でJSONを処理します。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
詳細については、この記事をお読みください。わたしにはできる
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."];
}
RTFではなくJSONが原因でここに到着した場合は、この回答を確認してください。 IOS JSONデシリアライゼーションの失敗-STIG/NSJSONSerializer