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、 編碼不一致問題
問題:
前后端編碼不一致導(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ù)溢出問題
問題:
JSON數(shù)據(jù)中的浮點(diǎn)型值,用系統(tǒng)方法NSJSONSerialization
解析為字符串后,出現(xiàn)精度誤差
解決方案:
1?? 后臺(tái)以字符串形式返回
2?? 解析時(shí)數(shù)據(jù)格式化,明確轉(zhuǎn)成doubleValue類型,如下:
NSString *value=[NSString stringWithFormat:@"%f",[dic[@"number"] doubleValue]];
5、 NSJSONSerialization解析JSON數(shù)字時(shí)的類型不一致
如下數(shù)據(jù)解析
json局部數(shù)據(jù)這樣的:{"content_id" : "666"}
NSString name = dic[@"content_id"]; 這句會(huì)產(chǎn)生類型錯(cuò)誤
雖然是"666"這樣的數(shù)字字符串,但還是要當(dāng)成id類型stringWithFormat一下
NSString name = [NSString stringWithFormat:@"%@",dic[@"content_id"]];
6、 保證JSON數(shù)據(jù)中的key值都是String類型。
如果JSON數(shù)據(jù)的key值為非String類型用NSJSONSerialization
解析會(huì)找不到key而報(bào)錯(cuò):
7、 JSON解析boolean類型數(shù)據(jù)字段時(shí)結(jié)果錯(cuò)誤
BOOL manage = [content objectForKey:@"manage"];
上面結(jié)果無論JSON數(shù)據(jù)中manage字段是0還是1,manage都為YES。
用BOOL接收J(rèn)SON字段時(shí),需要增加boolValue轉(zhuǎn)換:
BOOL manage = [[content objectForKey:@"manage"] boolValue];