1. 程式人生 > >iOS 伺服器返回NSData資料,解析為null

iOS 伺服器返回NSData資料,解析為null

通常情況下,使用下面的方法都能接收到伺服器資料都能正常解析為NSDictionary(responseObject為伺服器返回的二進位制資料)

NSDictionary * dicJson = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

但是在一些特殊的情況下,我們會遇到responseObject有資料,但是解析為我們想要的格式的時候為null(NSDictionary,NSS tring,NSArray我都嘗試過結果都一樣),在遇到這種的情況下,也許是伺服器的編碼格式和你的編碼格式不一致

(比如伺服器用的GBK而你用的UTF-8),那麼就會出現這種明明有資料確解析為null的結果,可以用以下方法進行轉碼後解析(responseObject依舊為伺服器返回的二進位制資料):

//定義GBK編碼格式
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
            //GBK格式接收資料並進行轉換
            NSString * retStr = [[NSString alloc]initWithData:responseObject encoding:enc];

            NSData * jsonData = [retStr dataUsingEncoding:enc];

            NSString
* jsonStr = [[NSString alloc]initWithData:jsonData encoding:enc]; //將資料轉為UTF-8 NSData * data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding]; //解析 NSDictionary * dicJson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil
];

下面再舉一解析例子,base64解碼eyJlcnJvckNvZGUiOi05OSwiZXJyb3JNc2ciOiLWuMHutO3O8yIsInJldE1zZyI6ItK1zvGxqM7E0uyzoyJ9

【這個用預設UTF-8編碼轉出來為null】

- (void)decodeBase64{

    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

    NSData *decodedData = [[NSData alloc]initWithBase64EncodedString:@"eyJlcnJvckNvZGUiOi05OSwiZXJyb3JNc2ciOiLWuMHutO3O8yIsInJldE1zZyI6ItK1zvGxqM7E0uyzoyJ9" options:0];

    NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:enc];
    NSLog(@"%@", decodedString);
}