iOS 伺服器返回NSData資料,解析為null
阿新 • • 發佈:2019-01-26
通常情況下,使用下面的方法都能接收到伺服器資料都能正常解析為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);
}