Windows Azureで実行されているWebサービスがあり、iPhoneアプリで使用するJSONを返します。
残念ながら、Windows Azureはまだ動的応答の圧縮をサポートしていないようです(長い話)ので、圧縮された(GZIPを使用した)文字列を含む非圧縮のJSONパッケージを返すことで回避することにしました。
例えば
{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}
...ここで、valueは、JSONで表される複雑なオブジェクトの圧縮された文字列です。
これはサーバーに実装するのは本当に簡単でしたが、私の人生では、gzipで圧縮されたNSStringを非圧縮のNSStringに解凍する方法を理解できません。zlibなどで見つけることができるすべての例は、ファイルなどを扱っています。
誰かが私にこれを行う方法についての手がかりを与えることができますか?(サーバー側の実装をdeflateを使用するように変更できるので、deflateを使用したソリューションにも満足しています)。
ありがとう!!
スティーブン
編集1:ああ、ASIHTTPRequestがソースコードで次の関数を使用していることがわかります。
//uncompress gzipped data with zlib
+ (NSData *)uncompressZippedData:(NSData*)compressedData;
...そしてNSStringをNSDataに変換できることを知っているので、これが私をどこにでも導くかどうかを確認します!
編集2:残念ながら、編集1で説明した方法では、どこにもつながりませんでした。
編集3: base64のエンコード/デコードに関する以下のアドバイスに従って、次のコードを思いつきました。encodeGzippedStringは、ご想像のとおり、gzipで圧縮されてbase64文字列に変換される文字列「こんにちは。私の名前はStevenElliottです」です。残念ながら、NSLogを使用して印刷した結果は空白になります。
NSString *encodedGzippedString = @"GgAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+uE6X2SJPiyZ93eaX+TI9Lcuiatvx/wOwYc0HGgAAAA==";
NSData *decodedGzippedData = [NSData dataFromBase64String:encodedGzippedString];
NSData* unGzippedJsonData = [ASIHTTPRequest uncompressZippedData:decodedGzippedData];
NSString* unGzippedJsonString = [[NSString alloc] initWithData:unGzippedJsonData encoding:NSASCIIStringEncoding];
NSLog(@"Result: %@", unGzippedJsonString);