如何使用“var abcd =”标头解析json数据

时间:2013-04-16 15:29:42

标签: iphone objective-c json cocoa-touch nsjsonserialization

我在iOS上解析json数据文件时遇到问题。 这是data.json文件中的一个示例:

var devs = [
{
"ident":"1",
"firstname":"Jan", 
"lastname":"Kowalski", 
"img":"http://www.placekitten.com/125/125", 
"tech":"iOS, HTML5, CSS, RWD",
"github":"placeholder",
"opensource":"1",
"twitter":"placeholder"
},
{
"ident":"2",
"firstname":"WacĹaw", 
"lastname":"GÄsior", 
"img":"http://www.placekitten.com/124/125",
"tech":"Android, Java, Node.js",
"github":"GÄsiorBKR",
"twitter":"wacek5565"
},

等等。

使用“普通”json文件:

NSURLResponse *response;
NSError *myError;
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL      URLWithString:@"http://somerailsapplication/posts.json"]     cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0f];
NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&myError];
NSDictionary *res = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&myError];

不幸的是,此解决方案在这种情况下不起作用。 有没有机会在没有在下载的数据中搜索特定字符串“var dev = [”和最后一个“]”的情况下工作?

2 个答案:

答案 0 :(得分:3)

响应是javascript,而不是JSON,因此您将无法直接使用JSON解析器。如果您无法更改服务器输出,最简单的方法是删除数据的开头和结尾,如您所建议的那样。您还可以将响应嵌入到HTML模板中并在Webview中对其进行评估,但这似乎还有很多工作要做。

答案 1 :(得分:0)

从您获得数据的那一刻开始:

NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&myError];
NSMutableString *dataAsString = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[dataAsString deleteCharactersInRange:NSMakeRange(0, 11)];
data = [dataAsString dataUsingEncoding:NSUTF8StringEncoding];
NSArray *res = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&myError];

这会将数据转换为字符串,删除前11个字符,将其转换回数据,然后照常解析。 (我已将其更改为NSArray,因为您的数据在数组中)