python - 将 Django json 导入 iPhone App

标签 python ios json django swift

我希望将一些 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/

相关文章:

ios - 如何使用 Swift 2.0 动态转换为在字符串中命名的类型?

ios - 将现有数组绑定(bind)到 tableView IOS

json - 使用 omitempty 时将嵌套结构中的 0/False 编码为 json

python - pd.series 更改列的值

python - 基于 asyncio 的库应该提供什么 API 来处理关键错误?

ios - 将 Floats 数组转换为 UnsafePointer<DSPComplex> 数组

javascript - 有没有一种方便的方法可以在不转换的情况下从 CSV 文件将值打印到 JS 图表?

android - 如何获取原始 Retrofit 响应字符串?

python - ReadDirectoryChangesW 阻止删除监视的目录

python - 将包含联系人的 MySQL 数据库导出到兼容的 CardDav 系统