1纹坐、 JSON數(shù)據(jù)帶有轉(zhuǎn)義字符
iOS現(xiàn)有Json解析框架+ ( id)JSONObjectWithData:options: error:
不支持對(duì)非標(biāo)準(zhǔn)格式Json的處理(特殊字符包括“\“ 偎痛、 ”\n“、 ”\r“等)
如:
{
\"data\":[
{
\"ReqCmd\":\"S3\",
\"Params\":{
\"authnum\":\"13815873815\"
}
}
]
}
處理辦法:1构捡、將帶有轉(zhuǎn)義字符的數(shù)據(jù)轉(zhuǎn)成字典(標(biāo)準(zhǔn)的JSON格式)再進(jìn)行解析
2液南、用“\“進(jìn)行轉(zhuǎn)義
2、 返回?cái)?shù)據(jù)值為NSNULL勾徽、null滑凉、nil等
方案解決:
1?? 從根源上與API協(xié)調(diào),盡量禁止返回值為NSNULL喘帚、null畅姊、nil這樣的值。
2?? 客戶端做處理吹由,處理值為NSNULL若未、null、nil的情況溉知≡纱瘢或者對(duì)消息進(jìn)行轉(zhuǎn)發(fā) 避免由于返回值有誤導(dǎo)致程序崩潰的情況
3腕够、 編碼不一致問(wèn)題
問(wèn)題:
前后端編碼不一致導(dǎo)致解析后的值亂碼、解析不了json數(shù)據(jù)舌劳、報(bào)錯(cuò)等帚湘。
解決方案:1、與后臺(tái)規(guī)定好統(tǒng)一編碼甚淡;2大诸、客戶端進(jìn)行編碼轉(zhuǎn)換;
4贯卦、 浮點(diǎn)型數(shù)據(jù)解析后小數(shù)溢出問(wèn)題
問(wèn)題:
JSON數(shù)據(jù)中的浮點(diǎn)型值资柔,用系統(tǒng)方法NSJSONSerialization
解析為字符串后,出現(xiàn)精度誤差
解決方案:
1?? 后臺(tái)以字符串形式返回
2?? 解析時(shí)數(shù)據(jù)格式化撵割,明確轉(zhuǎn)成doubleValue類(lèi)型贿堰,如下:
NSString *value=[NSString stringWithFormat:@"%f",[dic[@"number"] doubleValue]];
5、 NSJSONSerialization解析JSON數(shù)字時(shí)的類(lèi)型不一致
如下數(shù)據(jù)解析
json局部數(shù)據(jù)這樣的:{"content_id" : "666"}
NSString name = dic[@"content_id"]; 這句會(huì)產(chǎn)生類(lèi)型錯(cuò)誤
雖然是"666"這樣的數(shù)字字符串啡彬,但還是要當(dāng)成id類(lèi)型stringWithFormat一下
NSString name = [NSString stringWithFormat:@"%@",dic[@"content_id"]];
6羹与、 保證JSON數(shù)據(jù)中的key值都是String類(lèi)型。
如果JSON數(shù)據(jù)的key值為非String類(lèi)型用NSJSONSerialization
解析會(huì)找不到key而報(bào)錯(cuò):
7庶灿、 JSON解析boolean類(lèi)型數(shù)據(jù)字段時(shí)結(jié)果錯(cuò)誤
BOOL manage = [content objectForKey:@"manage"]纵搁;
上面結(jié)果無(wú)論JSON數(shù)據(jù)中manage字段是0還是1,manage都為YES往踢。
用BOOL接收J(rèn)SON字段時(shí)腾誉,需要增加boolValue轉(zhuǎn)換:
BOOL manage = [[content objectForKey:@"manage"] boolValue];