iOS - NSJSONSerialization抛出一些非常奇怪的错误

时间:2015-05-25 17:09:15

标签: ios json

好的,我正在使用以下代码

获取JSON文件
- (void)dataRequest {
    NSURL *dataURL = [NSURL URLWithString:@"link to JSON file"];
    NSURLRequest *dataRequest = [NSURLRequest requestWithURL:dataURL];
    NSURLConnection *dataConnection = [NSURLConnection connectionWithRequest:dataRequest delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSError *dataError;

    _dataDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&dataError];

    if (_dataDictionary == nil) {
        NSLog(@"JSON error: %@", dataError);
    }
}

Xcode似乎随机地想要正确地解析数据,但有时它会抛出这些看似随机的错误(前两个经常一起显示在日志中):

  

2015-05-25 18:09:35.506 UserProject [703:13236] JSON错误:错误域= NSCocoaErrorDomain代码= 3840"操作无法完成。 (可可误差3840。)" (解析对象时文件意外结束。)UserInfo = 0x7fb5735775b0 {NSDebugDescription =解析对象时意外的文件结尾。}

     

2015-05-25 18:09:35.510 UserProject [703:13236] JSON错误:错误域= NSCocoaErrorDomain代码= 3840"操作无法完成。 (可可误差3840。)" (JSON文本不以数组或对象和选项开头,以允许未设置片段。)UserInfo = 0x7fb57357d3b0 {NSDebugDescription = JSON文本不以数组或对象开头,并且选项允许未设置片段。}

     

2015-05-25 18:12:56.577 UserProject [835:15617] JSON错误:错误域= NSCocoaErrorDomain代码= 3840&#34;操作无法完成。 (可可误差3840。)&#34; (字符周围未转义的控制字符插入重复出现,但此处看似随机数。)UserInfo = 0x7fbb71e67e10 {NSDebugDescription =字符周围未转义的控制字符插入重复但这里看似随机的数字。} < / p>

我也有成功解析的问题,但是如果我在JSON中更改了这一行

"Title": "Projet Cars”,

"Title": "Projet CARS”,

然后Xcode抛出此错误:

  

2015-05-25 18:12:56.577 UserProject [835:15617] JSON错误:错误域= NSCocoaErrorDomain代码= 3840&#34;操作无法完成。 (可可误差3840。)&#34; (字符67周围未转义的控制字符。)UserInfo = 0x7fbb71e67e10 {NSDebugDescription =字符67周围未转义的控制字符。}

角色67在&#34之后是两个空格;标题&#34;:&#34; Projet CARS“

"Title": "Projet CARS”  < character 67 here

将线路更改回&#34;标题&#34;:&#34; Projet Cars“不会删除错误,但错误仍然存​​在,直到我删除&#34;标题&#34;: &#34; Projet Cars“和对象中的其他条目完全相同,然后等待一段时间才重新使用它。当我将其粘贴到(从我有的另一个文件中)后,我尝试更改&#34;标题&#34;:&#34; Projet Cars“到&#34;标题&#34;:&#34; Projet CARS”在等待一段时间后,它再次因所述错误而中断。

这个错误也多次发生而根本没有改变任何东西,只需在模拟器中重新运行应用程序就足以让Xcode抱怨一个看似随机的角色。例如,它可能完全正常工作,然后当重新运行应用程序时它表示1547处出现了问题,然后在重新运行应用程序之后它说它是导致问题的字符5769,然后它会一直说它的字符5769,错误来自此处。问题在于它总是只在空白区域或文本中间,包含正常字符(如字母和数字),不会引起任何问题。

我的JSON就是这样构建的:

{
"Array of objects": [
      {
      "Title": "entry 1",
      "Description": "entry 2",
      "Date": "entry 3",
      "DateText": "entry 4",
      "Picture": "entry 5",
      "Author": "entry 6",
      "Genre": "entry 7",
      "Features": "entry 8",
      "AltPicture": "entry 9",
      "Extra": "entry 10",
      "Sources": "entry 11",
      "Video": "entry 12"
      },
      {
      "Title": "entry 1",
      "Description": "entry 2",
      "Date": "entry 3",
      "DateText": "entry 4",
      "Picture": "entry 5",
      "Author": "entry 6",
      "Genre": "entry 7",
      "Features": "entry 8",
      "AltPicture": "entry 9",
      "Extra": "entry 10",
      "Sources": "entry 11",
      "Video": "entry 12"
      }

      // And so on..
      ]
}

我使用UTF-8保存我的JSON,并使用DropBox中的公共文件夹托管它。

我认为这可能是因为字节顺序标记,但我使用TextEdit,默认情况下它不会使用BOM保存文件。

有人知道究竟发生了什么吗?..

编辑:好的,这里有两个问题,如答案中所述,第一个是使用适合编程的文本编辑器,另一个是修复我的实际下载代码(我的帖子中的第一个代码示例)。 - 感谢您的所有答案,我会查看您的答案并修复我的代码。

2 个答案:

答案 0 :(得分:4)

这不是合法的JSON语法:

"Title": "Projet Cars”
                     ^

它应该是:

"Title": "Projet Cars"

答案 1 :(得分:1)

问题在于如何获取数据。您没有实现适当的委托方法。要知道的关键是可以多次调用didReceiveData:委托方法。您需要将所有收到的数据附加在一起并仅在您拥有所有数据时进行处理(至少在这种情况下)。

首先在您的班级中添加一个实例变量:

NSMutableData *_receivedData;

现在更新您的NSURLConnection委托方法,如下所示:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    _receivedData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSError *dataError;

    _dataDictionary = [NSJSONSerialization JSONObjectWithData:_receivedData options:kNilOptions error:&dataError];

    if (_dataDictionary == nil) {
        NSLog(@"JSON error: %@", dataError);
    }
}

当然,您还需要确保在JSON文件中使用正确的引号字符。