JSONKit 给出解析错误,但 JSONLint.org 说它是有效的

Posted

技术标签:

【中文标题】JSONKit 给出解析错误,但 JSONLint.org 说它是有效的【英文标题】:JSONKit giving parse error but JSONLint.org says it's valid 【发布时间】:2013-03-27 01:31:34 【问题描述】:

这是我的 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:是的,它处于构建阶段:

添加:

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 却没有的原因感到困惑。

【问题讨论】:

Was "" - 在 JSONLint 上验证时,可能有一些隐藏/控制/特殊字符(例如 BOM)没有被复制? 将“数据”转换为字符串并记录下来,以确保它都在那里。 【参考方案1】:

正如 pst 指出的那样,问题原来是BOM。在 Xcode 中,如果你右键单击文件名,选择“Open As”并选择“Hex”,你会看到:

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


原答案:

另外,您确定 JSON 包含在您的包中吗(检查“目标设置”的“构建阶段”中的“复制包资源”)。我刚刚使用 Cocoa 标准 JSON 解析类解析了您的 JSON,NSJSONSerialization ,没有意外。也许您应该尝试检查data 并确保一切正常:

NSLog(@"data=%@", [[[NSString alloc] initWithData:data] autorelease]);

但是我用JSONKitNSJSONSerialization 解析了你的JSON,没有发生任何意外。

NSString *filename = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:filename];
if (!data)

    NSLog(@"%s: data was nil", __FUNCTION__);
    return;

JSONDecoder *decoder = [[JSONDecoder alloc] initWithParseOptions:JKParseOptionNone];
NSError *error = nil;
id results =  [decoder objectWithData:data error:&error];

//  Also tested with NSJSONSerialization
//
//    id results = [NSJSONSerialization JSONObjectWithData:data
//                                                 options:0
//                                                   error:&error];

if (!error)
    NSLog(@"%s: results = %@", __FUNCTION__, results);
else
    NSLog(@"%s: error = %@", __FUNCTION__, error);

【讨论】:

JSONKit 非常明确地表明您必须严格遵守 JSON 的规则,而 NSJSONSerialization 则更宽松。 @borrrden 我刚刚用JSONKit 尝试了提供的JSON,它工作正常。就个人而言,我希望看到 Mark 在进一步诊断完成之前验证 data 是否已成功加载。 添加了上面的图片以显示我正在测试的 .json 文件已添加到目标构建阶段“复制捆绑资源” 还添加了对 if(!data) 的测试,它没有进入这种情况,所以 data 不是 nil。 Rob 解决了,基本上文件开头有多余的字符是看不到的,但是是Xcode在从空文件模板创建文件并粘贴json时添加的。教训是,如果可能的话,在另一个编辑器中创建文本文件。

以上是关于JSONKit 给出解析错误,但 JSONLint.org 说它是有效的的主要内容,如果未能解决你的问题,请参考以下文章

iOS关于JSONKit解析Unicode字符内容出错,问题出在u0000

JSONKit 无法从 php 解析简单的 JSON?

JSONKit 实现上的错误

IOS 网络浅析-(七 JSON解析之三方JSONKit)

JSON解析(引入第三方JSONKit)

无法为 JSONkit 关闭 ARC