我希望将一些 Django json 导入到我的 iPhone 应用程序中。以下 Django 代码:
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 中有以下快速代码:
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 导入是否有问题。如有任何帮助,我们将不胜感激。
提前致谢,艾伦。
最佳答案
您的 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
Swift 2 更新:
还是一样的想法但是更安全。
为简单起见,我们可以使用 try?
和多个 if let
:
if let data = data,
json = try? NSJSONSerialization.JSONObjectWithData(data, options: []),
arr = json as? NSArray {
// use arr
}
如果你需要处理来自 NSJSONSerialization(或其他抛出方法)的错误,那么 Do-Try-Catch 就是这样:
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
等异步方法。
关于python - 将 Django json 导入 iPhone App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29879520/