2015-04-26 53 views
1

我正在寻找将一些Django json导入到iphone应用程序中。下面的Django代码:将Django json导入iPhone应用程序

def jsonfixture(request): 

    data = StraightredFixture.objects.filter(fixturematchday=12) 
    json_data = serializers.serialize('json', data, use_natural_foreign_keys=True) 
    return HttpResponse(json_data, content_type='application/json') 

产生以下JSON在我的浏览器:

[{"fields": {"awayteamscore": 2, "hometeamscore": 1, "home_team": "Stoke", "away_team": "Burnley", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136932}, {"fields": {"awayteamscore": 1, "hometeamscore": 2, "home_team": "ManCity", "away_team": "Swans", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136930}, {"fields": {"awayteamscore": 0, "hometeamscore": 0, "home_team": "Foxes", "away_team": "Sunderland", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 137852}, {"fields": {"awayteamscore": 1, "hometeamscore": 2, "home_team": "Everton", "away_team": "West Ham", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136929}, {"fields": {"awayteamscore": 0, "hometeamscore": 2, "home_team": "Chelsea", "away_team": "West Bromwich", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136928}, {"fields": {"awayteamscore": 0, "hometeamscore": 1, "home_team": "Newcastle", "away_team": "QPR", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136931}, {"fields": {"awayteamscore": 2, "hometeamscore": 1, "home_team": "Arsenal", "away_team": "ManU", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T17:30:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136927}, {"fields": {"awayteamscore": 1, "hometeamscore": 3, "home_team": "Crystal", "away_team": "Liverpool", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-23T13:30:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136926}, {"fields": {"awayteamscore": 2, "hometeamscore": 1, "home_team": "Hull", "away_team": "Spurs", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-23T16:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136925}, {"fields": {"awayteamscore": 1, "hometeamscore": 1, "home_team": "Aston Villa", "away_team": "Southampton", "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-24T20:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136924}] 

然后我在Xcode以下SWIFT代码:

let url2 = NSURL(string: "http://localhost:8000/straightred/jsonfixture") 
let data = NSData(contentsOfURL: url2!) 
var dict = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSDictionary 

然而,在它的错误错误代码“EXC_BAD_INSTRUCTION”中的第三行。

很遗憾,我不知道django json输出或swift xcode json导入是否有问题。任何帮助,将不胜感激。

非常感谢,艾伦。

回答

0

您的JSON数据是字典的数组,而不是字典。 您必须将反序列化结果转换为NSArray而不是NSDictionary。

改变这一行:

var dict = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSDictionary 

var arr = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSArray 

斯威夫特2更新:

还是一样的想法,但更安全。

为了简单起见,我们可以使用try?与多if let

if let data = data, 
    json = try? NSJSONSerialization.JSONObjectWithData(data, options: []), 
    arr = json as? NSArray { 
    // use arr 
} 

如果你需要从NSJSONSerialization(或其他投掷方法)处理错误,那么就-尝试捕获的方式是:

do { 
    if let data = data, 
     json = try NSJSONSerialization.JSONObjectWithData(data, options: []), 
     arr = json as? NSArray { 
     // use arr 
    } 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 

此外,只是一个说明:在你的例子中,你正在使用NSData(contentsOfURL:)。可以使用它来进行试验,但是您应该始终使用异步方法(如NSURLSession)代替实际代码。

+1

就这么简单!真的很感激迅速的回应。谢谢。 –