今日在程序中發(fā)現(xiàn)一個(gè)解析json報(bào)錯(cuò)的問(wèn)題汁针,總是報(bào)如下錯(cuò):
Error Domain=NSCocoaErrorDomain Code=3840 "
The operation couldn’t be completed. (Cocoa error 3840.)"
(Unexpected end of file during string parse
(expected low-surrogate code point but did not find one).)
UserInfo=0x7fc9b3646520 {NSDebugDescription=Unexpected end of
file during string parse (expected low-surrogate code point but did not
find one).
搜了下low-surrogate code point發(fā)現(xiàn)是缺少低位代理碼,導(dǎo)致無(wú)法正常解析json數(shù)據(jù)。
仔細(xì)檢查了下數(shù)據(jù)來(lái)源發(fā)現(xiàn)當(dāng)用戶(hù)發(fā)布的文字內(nèi)容是“給自己一個(gè)微笑也給他人一個(gè)微笑????”時(shí),后臺(tái)在截取一定長(zhǎng)度字符串的時(shí)候剛好截取到表情符號(hào)的編碼位置殉挽,導(dǎo)致截取了一部分表情編碼給我:
"newContent": {
"id": "56",
"title": null,
"articleThumbImage": null,
"articleType": null,
"content": "給自己一個(gè)微笑也給他人一個(gè)微笑?",
"weburl": null,
"action": null,
"linkEntityId": null,
"userId": null,
"userName": null,
"userGender": null,
"userIcon": null,
"userTitle": null,
"praiseCount": null,
"commentCount": null,
"circleName": null,
"circleThumbImage": null
},
由此看見(jiàn)content字段中包含了第一個(gè)表情的一部分編碼丰涉,因?yàn)槿鄙俸竺嬉徊糠志幋a,所以導(dǎo)致iOS這邊無(wú)法正常解析該json此再。
這個(gè)是我們?cè)诮厝∽址L(zhǎng)度的時(shí)候容易忽略考慮到的地方。谷歌搜了下Error Domain=NSCocoaErrorDomain Code=3840關(guān)鍵字玲销,發(fā)現(xiàn)之前有人也遇到過(guò)類(lèi)似的問(wèn)題输拇,但是都不是這個(gè)問(wèn)題,特做此記錄贤斜,希望能幫到大家策吠。
2016-2-17補(bǔ)充:
由于后臺(tái)人員不給解決這個(gè)問(wèn)題要客戶(hù)端自己處理,經(jīng)過(guò)查閱發(fā)現(xiàn)JSONKit可以處理這個(gè)問(wèn)題瘩绒,我暫時(shí)就使用了JSONKit來(lái)處理這種問(wèn)題:
id result = [NSJSONSerialization JSONObjectWithData:data options:options error:&error];
if (error) { error = nil; result = [data objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode error:& error];
// use JSONKit }
原文:
NSJSONSerialization - “Unexpected end of file during string parse”
2018-12-01補(bǔ)充
出現(xiàn)這個(gè)問(wèn)題往往是由于字符串被“非正常截?cái)唷睂?dǎo)致的猴抹,比如文中講到的,當(dāng)字符串中包含了表情或者特殊字符锁荔,當(dāng)它們的編碼長(zhǎng)度是兩位或者三位時(shí)蟀给,如果在我們截?cái)嘧址臅r(shí)候剛好把一部分編碼給截?cái)嗔耍蜁?huì)導(dǎo)致沒(méi)法正常的解碼了阳堕。所以跋理,我們?cè)诮厝∽址臅r(shí)候要謹(jǐn)慎一點(diǎn),建議使用以下方法來(lái)截忍褡堋:
NSRange realRange = [text rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, maxNum)];
text = [text substringWithRange:realRange];