JSONKit提供解析错误,但JSONLint.org表示它是有效的

时间:2013-03-27 01:31:34

标签: iphone ios json cocoa-touch jsonkit

这是我的post.json文件:

[
    {
        "Title": "Introduction to WCF",
        "Url": "http://myaddress/videos/introduction-to-wcf",
        "Thumbnail": "http://myaddress/images/20110212_01.jpg",
        "Exceprt": "Introduction to WCF",
        "PostDate": "2011-02-12T14:26:07",
        "Id": 39,
        "Mp4Video": "http://myaddress/2012/05/20110212_01.mp4",
        "Speakers": [
            {
                "Name": "Mark Wilkinson",
                "Slug": "mark-wilkinson"
            }
        ],
        "Groups": [
            {
                "Name": "C# UG",
                "Slug": "cs-ug"
            }
        ],
        "Tags": [
            {
                "Name": "WCF Services",
                "Slug": "wcf-services"
            }
        ]
    }
]

在jsonlint.org上发布并验证。

这是我用于其他工作的JSON文件的代码:

- (void)test_can_read_from_groups_file_and_build_JSONDictionary {

    id result = [self data_from_JSON_file:@"post"];
    [Assert isNotNil:result];  // is returning as nil, so test is failing
}

- (id)data_from_JSON_file:(NSString *)fileName {

    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    NSString *jsonString = [bundle pathForResource:fileName ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:jsonString];
    JSONDecoder *decoder = [[JSONDecoder alloc] initWithParseOptions:JKParseOptionNone];

    NSError *error = nil;
    id result =  [decoder objectWithData:data error:&error];
    if (error) {
        NSLog(@"*********\r\r\r\r\r\r\r Error was: %@", [error localizedDescription]);
    }

    return result;
}

从JSONKit objectWithData:

打印出来的错误
Error was: Unexpected token, wanted '{', '}', '[', ']', ',', ':', 'true', 'false', 'null', '"STRING"', 'NUMBER'.

ETA:是的,它处于构建阶段:

enter image description here

加入:

if (!data)
{
    NSLog(@"\r\r\r\r\r\r%s: data was nil", __FUNCTION__);
    return nil;
}

它没有达到这个分支所以数据不是零。

使用JSONKit解码器更改为:

id results = [NSJSONSerialization JSONObjectWithData:data
                                                 options:kNilOptions error:&error];

并且它仍然有效,仍然困惑为什么JSONKit对我失败但对Rob没有。

1 个答案:

答案 0 :(得分:1)

正如pst所指出的,问题原来是BOM。在Xcode中,如果右键单击文件名,选择“打开为”并选择“十六进制”,您将看到:

hex dump

前三个字符显然不是标准文本字符。幸运的是,您可以在Xcode中的十六进制编辑器中突出显示这三个字符,删除它们,保存文件,现在它将修复它。


原始答案:

此外,你确定你的包中包含了JSON(在“目标设置”的“构建阶段”中选中“复制包资源”。)我只是使用Cocoa标准JSON解析类{{1}解析了你的JSON没有事件。也许您应该尝试检查NSJSONSerialization并确保一切正常:

data

但我使用NSLog(@"data=%@", [[[NSString alloc] initWithData:data] autorelease]); JSONKit解析了您的JSON而没有发生任何事故。

NSJSONSerialization