Ios NSJSONSerialization-“NSJSONSerialization”;字符串分析过程中出现意外的文件结尾";
我在解析某个REST响应时遇到一些有线问题。问题是,我无法复制它。有时会发生这种情况,我在错误日志中没有相应的信息。Ios NSJSONSerialization-“NSJSONSerialization”;字符串分析过程中出现意外的文件结尾";,ios,json,nsjsonserialization,Ios,Json,Nsjsonserialization,我在解析某个REST响应时遇到一些有线问题。问题是,我无法复制它。有时会发生这种情况,我在错误日志中没有相应的信息。 很抱歉,由于敏感的用户数据,我不允许从JSON响应中向您提供任何信息(它仅出现在一些内部帐户上,其中错误日志级别设置为低以检测此问题) 其他一些信息: JSON有效(通过检查) 当试图重现此问题时,我会得到其他N错误描述,如: 位置XYZ处的字符无效 无效对象 更新1:解析机制(NSData的扩展) 更新2:nsUpdate 1中下载数据的操作-main()的
很抱歉,由于敏感的用户数据,我不允许从JSON响应中向您提供任何信息(它仅出现在一些内部帐户上,其中错误日志级别设置为低以检测此问题)
其他一些信息:
- JSON有效(通过检查)
- 当试图重现此问题时,我会得到其他N错误描述,如:
- 位置XYZ处的字符无效
- 无效对象
更新1:解析机制(NSData的扩展)
更新2:nsUpdate 1中下载数据的操作-main()的内容-->调用函数
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = nil;
for (NSInteger i=0; i<kMaxRequestRetry; i++) {
data = [NSURLConnection sendSynchronousRequest: request
returningResponse: &response
error: &error];
if (!error) {
// Handling internal errors and retry mechanism
}
[NSThread sleepForTimeInterval:1.0];
}
// Check http status code
NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
if (statusCode < 200 || statusCode >= 300) {
CLogWarn(@"Request finished with status code = %d", (int)statusCode);
}
// Evaluate response
if (error) {
CLogError(@"%@", error);
[self requestFinishedWithResult:@"{\"errorCode\":99}";
return;
} else {
NSError *parseError = nil;
NSDictionary *responseDic = [data objectFromJSONDataWithError:&parseError];
// Detect parse issues
if (parseError) {
CLogError(@"JSONParse-Error: %@", parseError);
[self requestFinishedWithResult:[NSString stringWithFormat:@"{\"errorCode\":%d}", (11000 + (int)parseError.code)]];
return;
}
// Success handling
}
我很乐意提供关于如何强制执行此错误代码的任何信息或提示 致以最诚挚的问候,
克里斯发现了这个问题。json对象中的“snippet”包含来自原始消息的子字符串。我们的API(用java编写)使用substring方法,这是代理项对的一部分。android和windows客户端对此没有问题,只显示一个无效字符,但NSJSONSerialization会抛出此错误
通过苹果开发者论坛获得提示:问题复制 此问题的原因是
json
中的字符串包含非法的Unicode点。以下代码可以重现此问题
NSString* test = @"{\"\\ud801\" : 1}";
NSError* error = nil;
id result = [NSJSONSerialization JSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
NSLog(@"error: %@", error);
解决方案
根据,您可以使用JSONKit
作为附加解析器。e、 g
id result = [NSJSONSerialization JSONObjectWithData:data options:options error:&error];
if (error) {
error = nil;
result = [data objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode error:& error]; // use JSONKit
}
错误消息表示您试图解析不完整的JSON对象。如果没有更多的信息(例如解析是如何完成的),可能很难提供帮助。显示JSON本身失败或者剥离敏感数据如何?@Lukasz'Severiaan'Grela:请参阅更新1-它适用于所有其他15个请求。我想某些json中一定有一些腐败的字符values@MartinR:在这种情况下,JSON大约有1000行长(Messenger应用程序)。因为我使用的是有效的JSON,所以我认为它一定是JSON obejct(Message Data=String)中的一些字符。@Chris:objectfromJSONDATAWERROR从哪里调用?(一个常见的错误是数据以块的形式读取,并且每个块都被单独解析。)
{
"errorCode": 0,
"conversations": [
{
"address": "+43664000000",
"snippet": "This is an dummy text",
"messagesUnread": 1,
"messagesUnsent": 2,
"messages": 9,
"maxMessageId": 151672,
"dateLastMessage": 1386353756858
}
]
}
NSString* test = @"{\"\\ud801\" : 1}";
NSError* error = nil;
id result = [NSJSONSerialization JSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
NSLog(@"error: %@", error);
id result = [NSJSONSerialization JSONObjectWithData:data options:options error:&error];
if (error) {
error = nil;
result = [data objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode error:& error]; // use JSONKit
}