30

我很难在 iOS 5 上解析下面的 JSON 字符串。

{"States": [{"Name": "Arizona","Cities": [{"Name": "Phoenix"}]},{"Name": "California","Cities": [{"Name": "Orange County"},{"Name": "Riverside"},{"Name": "San Diego"},{"Name": "San Francisco"}]},{"Name": "Nevada","Cities": [{"Name": "Las Vegas"}]}]}

这是我的代码:

- (void) parseJson {
NSError *jsonError = nil;
NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"]];

if (jsonData) {
    NSDictionary *jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];

    if (jsonError) {
        NSLog(@"JSON Error: %@", [jsonError localizedDescription]);

        return;
    }

    NSLog(@"%@", jsonObjects);
}
}

我不断收到此错误:

JSON Error: The operation couldn’t be completed. (Cocoa error 3840.)

我很感激这方面的一些帮助,因为我显然无法解决这个问题。

4

4 回答 4

23

让我觉得不正确的一件事是:

[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"]

你的数据是一个RTF文件??它应该是一个txt文件(或任何其他类型的纯文本文件)。RTF 文件通常包含文本格式数据,如下所示:

{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural

\f0\fs24 \cf0 \{"States": [\{"Name": "Arizona","Cities": [\{"Name": "Phoenix"\}]\},\{"Name": "California","Cities": [\{"Name": "Orange County"\},\{"Name": "Riverside"\},\{"Name": "San Diego"\},\{"Name": "San Francisco"\}]\},\{"Name": "Nevada","Cities": [\{"Name": "Las Vegas"\}]\}]\}}

当我将其作为数据读入并尝试将其解析为 JSON 时,我收到了您所看到的 3840 错误。该错误的描述说:

数据已损坏,无法读取。(字符 2 周围的对象中没有值的字符串键。)

所以在我看来,你实际上并没有 JSON。你有 RTF 数据。

于 2012-06-24T00:50:48.380 回答
11

我遇到了类似的问题。当我从服务器下载 JSON 数据时,我的 JSON 解析器会间歇性地工作。您是否从该函数中获取了 JSON 数据?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

此函数返回的 NSData 可能是部分数据。您需要将数据附加到类型为:NSMutableData 的实例变量。然后您在另一个函数中处理您的 JSON,如下所示:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

阅读本文了解详情。这个对我有用

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

于 2012-08-28T15:01:32.923 回答
10

我能够通过将NSData对象转换为以下内容来解决我的 JSON 3840 错误NSString

NSError *error;

NSObject *object = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

if (object == nil) {
    NSString *serverResponse = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];

    NSLog(@"\n\nError:\n%@\n\nServer Response:\n%@\n\nCrash:", error.description, serverResponse);
    [NSException raise:@"Invalid Data" format:@"Unable to process web server response."];
}
于 2014-10-06T06:51:10.013 回答
1

如果您是因为 JSON 而不是因为 RTF 而来到这里的,请查看这个答案: IOS JSON Deserialization failure - STIG/NSJSONSerializer

于 2012-07-22T00:25:14.927 回答