Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSJSONSerialization-“NSJSONSerialization”;字符串分析过程中出现意外的文件结尾";_Ios_Json_Nsjsonserialization - Fatal编程技术网

Ios NSJSONSerialization-“NSJSONSerialization”;字符串分析过程中出现意外的文件结尾";

Ios NSJSONSerialization-“NSJSONSerialization”;字符串分析过程中出现意外的文件结尾";,ios,json,nsjsonserialization,Ios,Json,Nsjsonserialization,我在解析某个REST响应时遇到一些有线问题。问题是,我无法复制它。有时会发生这种情况,我在错误日志中没有相应的信息。 很抱歉,由于敏感的用户数据,我不允许从JSON响应中向您提供任何信息(它仅出现在一些内部帐户上,其中错误日志级别设置为低以检测此问题) 其他一些信息: JSON有效(通过检查) 当试图重现此问题时,我会得到其他N错误描述,如: 位置XYZ处的字符无效 无效对象 更新1:解析机制(NSData的扩展) 更新2:nsUpdate 1中下载数据的操作-main()的

我在解析某个REST响应时遇到一些有线问题。问题是,我无法复制它。有时会发生这种情况,我在错误日志中没有相应的信息。


很抱歉,由于敏感的用户数据,我不允许从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
 }