python - 无法在 Swift 中读取 JSON 返回的数组,如 Python 枚举
问题描述
我正在尝试从 GitHub的https://github.com/joshfraser/robinhood-to-csv存储库复制以下 Python 代码行,以读取我的交易历史记录。
orders = robinhood.get_endpoint('orders')
paginated = True
page = 0
while paginated:
for i, order in enumerate(orders['results']):
executions = order['executions']
instrument = robinhood.get_custom_endpoint(order['instrument'])
fields[i + (page * 100)]['symbol'] = instrument['symbol']
for key, value in enumerate(order):
if value != "executions":
fields[i + (page * 100)][value] = order[value]
if order['state'] == "filled":
trade_count += 1
for key, value in enumerate(executions[0]):
fields[i + (page * 100)][value] = executions[0][value]
elif order['state'] == "queued":
queued_count += 1
# paginate
if orders['next'] is not None:
page = page + 1
orders = robinhood.get_custom_endpoint(str(orders['next']))
else:
paginated = False
我们也有
def get_endpoint(self, endpoint=None):
res = self.session.get(self.endpoints[endpoint])
return json.loads(res.content.decode('utf-8'))
因此,我一直在研究以下 iOS 代码。我在 XCode 游乐场中使用此代码,因此请随意制作一个跟随
import UIKit
import PlaygroundSupport
let LoginEndpoint:String = "https://api.robinhood.com/api-token-auth/"
let LoginRequestData:[String : String] = ["username": "EmailAdress", "password": "Password"]
let OrdersEndpoint:String = "https://api.robinhood.com/orders/"
func httpReq(type: String, url: String, body:[String : String], header:[String : String]) -> ([String : Any]?, Data?, String?){
let url = URL(string: url)
var returnData:([String : Any]?, Data?, String?)? = nil
if let url = url {
var request = NSMutableURLRequest(url: url) as URLRequest
request.httpMethod = type
var postString = ""
for (key, value) in body {
if (postString != "") {
postString += "&"
}
postString += "\(key)=\(value)"
}
request.httpBody = postString.data(using: .utf8)
for (key, value) in header {
request.addValue(value, forHTTPHeaderField: key)
}
let _ = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) in
if let data = data {
do {
let jsonSerialized = try JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]
returnData = (jsonSerialized, data, nil)
} catch (_) {
returnData = (nil, data, "JSON Parse Erro")
}
} else if let error = error {
returnData = (nil, nil, error.localizedDescription)
}
}).resume()
}
while (returnData == nil) {}
return returnData!
}
let tokenQuery = httpReq(type: "POST", url: LoginEndpoint, body: LoginRequestData, header: [:])
if let token = tokenQuery.0?["token"] {
print("token \(token)")
let historyQuery = httpReq(type: "GET", url: OrdersEndpoint, body: [:], header: ["Authorization": "Token \(token)"])
if let results = historyQuery.0?["results"], let countString = historyQuery.0?["count"] {
}
}
RunLoop.main.run()
PlaygroundPage.current.needsIndefiniteExecution = true
如您所见,我正在使用身份验证令牌来访问订单端点。我确实从订单端点得到了很好的响应,但我不知道如何解释它。
从 python 代码看来,它正在返回一个 JSON 对象数组,但是我不知道如何快速到达该数组。我什至不确定我是否正确解码。有趣的是,当您查看 Playgrounds 中返回的对象时,XCode 似乎知道有一个数组正在运行。我怎么去呢?
解决方案
由于缺少凭据,无法真正了解您的服务返回的信息。
但是,请查看SwiftyJSON。这是一个非常好的库,对于在 Swift 中处理 JSON 数据非常有帮助。它应该可以解决您的 JSON 处理问题。
推荐阅读
- r - R 我可以将一个位置存储在某个东西中,这样我就可以多次引用它而不必重新输入它或者它是否会改变?
- nativescript - 检测手机震动 - NativeScript
- java - 这种通过“桶”查找元素的集合/算法的名称是什么
- javascript - 如何避免 - 使用 Cheerio 抓取网页时出现错误 403
- reactjs - 如何在 Material-UI Snackbar 组件中实现右滑功能?
- python - 根据前几行的值从数据框中过滤行
- excel - Excel 数据验证 - 限制字符类型和长度
- c# - .NET Core Main() 中的依赖注入不起作用
- delphi - 如何打开和保存大量子表单以响应父表单更改?
- r - 将 rmd 文件从一个项目移动到另一个项目时出现 R 问题(工作目录问题)