TL; DR:一个JSON请求有时返回一个对象,有时返回一个键的对象数组,但我不知道如何使用Swift 4正确解析该对象。
前言:我正在使用NextBus
API
制作公共汽车服务应用程序,以提供教堂山地区公共汽车的公共汽车时刻表更新和预测。但是,在获取公交车站的预测信息时遇到问题(
NextBus API PDF的pp 13-15页上的预测请求信息 )。
问题:
停止预测的请求返回两个键:“预测”和“版权”。尽管“版权”键始终返回用于预测请求的字符串,但“预测”键有时会返回对象,有时会根据路线上是否有两条公交车返回数组。
这是Postman可视化的问题:
预测返回一个数组:
{
"predictions": [
{
"agencyTitle": "Chapel Hill Transit",
"routeTag": "N",
"routeTitle": "N",
"stopTitle": "Estes Park Apts - Departure",
"stopTag": "estepark",
"dirTitleBecauseNoPredictions": "To Family Practice Building"
},
{
"agencyTitle": "Chapel Hill Transit",
"routeTag": "N",
"routeTitle": "N",
"stopTitle": "Estes Park Apts - Arrival",
"stopTag": "estepark_a",
"dirTitleBecauseNoPredictions": "To Family Practice Building"
}
],
"copyright": "All data copyright Chapel Hill Transit 2018."
}
预测返回一个对象:
{
"predictions": {
"agencyTitle": "Chapel Hill Transit",
"routeTag": "A",
"routeTitle": "A",
"stopTitle": "Martin Luther King Jr Blvd at Timber Hollow",
"stopTag": "airptimb_s",
"dirTitleBecauseNoPredictions": "To Northside"
},
"copyright": "All data copyright Chapel Hill Transit 2018."
}
我正在使用Swift 4在Xcode 9.4.1中创建此应用程序。这是当前处理请求的代码:
func fetchStopPrediction(stopId: String, routeTag: String, completion: @escaping (Predictions) -> Void) {
let routeInfo = "\(stopId)&routeTag=\(routeTag)"
let urlString = baseUrl + routeInfo
print(urlString)
Alamofire.request(urlString, method: .get).responseJSON { (response) in
if let jsonResponse = response.result.value {
print("JSON: \(jsonResponse)")
}
if let data = response.data {
do {
let predictions = try self.decoder.decode(Predictions.self, from: data)
completion(predictions)
} catch let error {
print("Error", error)
}
}
}
}
struct Predictions: Codable {
let predictions: [Prediction?]
let copyright: String?
}
您必须编写一个自定义初始化程序。首先解码字典,如果字典解码失败
struct Predictions : Decodable {
let predictions: [Prediction]
let copyright: String
private enum CodingKeys: String, CodingKey { case predictions, copyright }
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
copyright = try container.decode(String.self, forKey: .copyright)
do {
let prediction = try container.decode(Prediction.self, forKey: .predictions)
predictions = [prediction]
} catch DecodingError.typeMismatch {
predictions = try container.decode([Prediction].self, forKey: .predictions)
}
}
}
问题内容: 我在某处读到,函数应始终仅返回一种类型,因此以下代码被视为错误代码: 我想更好的解决方案是 返回None然后创建一个新的空元组不是更便宜的内存明智的选择吗?或者即使在较大的项目中,这种时差也太小而无法引起注意? 问题答案: 为什么函数应该返回一致类型的值?满足以下两个规则。 规则1-函数具有“类型”-输入映射到输出。它必须返回一致的结果类型,否则它不是函数。一团糟。 从数学上讲,我们说
我有一个使用swagger UI的swagger标记文档,它总是返回text/html,但应该返回application/json。POST请求和其他类型返回Application/JSON,但这个特定的GET请求不返回。服务endpoint代码正确。如果我将请求更改为POST,它将返回application/json。因此,在swagger中只有type GET不返回正确的类型。有什么想法,如何
如果请求接受头的类型为application/JSON,我希望能够发送类似JSON列表的列表,但如果请求头的类型为application/avro,则以字节数组(avro格式)发送它。这应该针对相同的RESTendpoint,如/某物/员工。我是否可以使用相同的方法但返回类型不同,Spring Boot是否会查看accept标头并正确决定调用哪个方法? 退货类型应该是什么?这是一种没有任何类型的反
我使用 Visual Studio AWS 扩展是为了使用 Docker 映像模板创建简单的 aws lambda 函数。Docker 映像已生成、标记并最终推送到容器注册表。从那里,我使用容器映像创建一个新的 lambda 函数。但是当我测试它时(在本地使用dotnet lambda调用函数或使用AWS控制台上的测试工具),我得到了 亚马逊Lambda工具。NET核心应用程序(5.3.0)项目主
我需要编写一个 rest 服务,它接受 XML/JSON 作为输入(POST 方法)和 XML/JSON 作为输出(基于输入格式)。我尝试了以下方法来实现这一目标,但没有帮助。终结点方法同时接受 XML/JSON,但在响应时,它始终根据 @RequestMapping -produces 中指定的顺序提供 JSON 或 XML。任何帮助将不胜感激。 我的endpoint方法: POJO班:学生.j
概述 Django 使用Request 对象和Response 对象在系统间传递状态。 当请求一个页面时,Django会建立一个包含请求元数据的 HttpRequest 对象。 当Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数。每个视图会返回一个HttpResponse 对象。 本文档对HttpRequest 和HttpResponse 对象的API 进行说