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]);
但是我用JSONKit
和NSJSONSerialization
解析了你的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 说它是有效的的主要内容,如果未能解决你的问题,请参考以下文章