2013-01-23 15 views
9

Metro Office Datapoint APIからJSONを読み取るNSJSONSerializationに問題があります。NSJSONSerialization - データを文字列に変換できません

は、私がチェックし、JSON自体はのカップルに応じて有効であると思わ

{"id":"353556","latitude":"57.1893","longitude":"-5.0929","name":"Sóil Chaorainn"} 

文字の位置に応じて、これは問題のある行と思いき

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unable to convert data to string around character 58208. 

次のエラーを取得しますバリデーター私は試してみましたが、Met Officeなどの大規模な組織からも期待していました。

NSJSONSerializationは「ó」などの文字でうまく動作しませんか?

これに対処するためにエンコードタイプを変更するにはどうすればよいですか?

多くのありがとうアドバンス

+0

を作成するので、あなたは変換について確認することができます。 –

答えて

21

Met Office Datapointは、NSJSONSerializationでサポートされているデータ形式の1つではないISO-8859-1でデータを返します。

最初にNSISOLatin1StringEncodingを使用してURLコンテンツから文字列を作成し、NSUTF8エンコーディングでNSJSONSerializationで使用するNSDataを作成します。 NSStringのを受け入れる1 - -

次の作品は異なるJSONパッケージを試してみて、対応するJSONオブジェクト

NSError *error; 
NSString *string = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/sitelist?key=<YOUR_API_KEY"] encoding:NSISOLatin1StringEncoding error:&error]; 

NSData *metOfficeData = [string dataUsingEncoding:NSUTF8StringEncoding]; 

id jsonObject = [NSJSONSerialization JSONObjectWithData:metOfficeData options:kNilOptions error:&error]; 

if (error) { 
    //Error handling 
} else { 
    //use your json object 
    NSDictionary *locations = [jsonObject objectForKey:@"Locations"]; 
    NSArray *location = [locations objectForKey:@"Location"]; 
    NSLog(@"Received %d locations from the DataPoint", [location count]); 
} 
+0

次のNSData * data = [NSData dataWithContentsOfURL: kMetOfficeAllSites]を使用しています。次のURLからhttp://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/json/sitelist?res=daily&key= NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data オプション:kNilOptions エラー:&エラー]; –

+1

ちょうどそれを作った。実際、dataPointからのエンコーディングはISO-8859-1(NSISOLatin1)です。あなたはちょうどそれをStringで取得し、そこからUTF-8 NSDataを作成する必要があります。私はそれで上記の私の答えを更新しています。 –

+0

多くのありがとうエリックソリューションです。これはデータポイントからすべてのJSONをISO-8859-1のように扱う最良の方法だと思います。あなたはエンコーディングタイプをどのように見つけたのですか? –

4

JSONのエンコードとは何ですか? JSONはUTF-8になっているはずですが、私はISO-8859-1を使用するAPIが不十分であると見ています。 NSJSONSerializationは、UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BEのみで動作します。

+0

エンコードをチェックする最善の方法はわかりませんが、JSONフィードをChromeにロードし、ツール/エンコーディングの下にWestern(ISO-8859-1)と書いてありますので、 -エンコード? –

関連する問題