我在解析json数据时遇到问题。我可以打印“ myJson”,所以我知道链接正在工作,但是if let time = myJson [“ metrics”]!如? NSDictionary无法正常工作。有任何想法吗?
这就是myJson的样子
{
metrics = (
{
"Average Inventory" = "4031000000.0";
"Average Payables" = "51062000000.0";
"Average Receivables" = "47399500000.0";
"Book Value per Share" = "20.15";
"Capex per Share" = "-0.6184";
"Capex to Depreciation" = "-0.8735";
"Capex to Operating Cash Flow" = "0.1395";
"Capex to Revenue" = "0.0434";
"Cash per Share" = "10.8764";
"Current ratio" = "1.54";
"Debt to Assets" = "0.3192";
"Debt to Equity" = "1.194";
"Dividend Yield" = "0.0134";
"EV to Free cash flow" = "17.3127";
"EV to Operating cash flow" = "14.6943";
"EV to Sales" = "3.9191";
"Earnings Yield" = "0.0534";
"Enterprise Value" = "1019650744600.0";
"Enterprise Value over EBITDA" = "13.025";
"Free Cash Flow Yield" = "0.0582";
"Free Cash Flow per Share" = "4.927";
"Graham Net-Net" = "-0.0842";
"Graham Number" = "73.6675";
"Income Quality" = "1.4548";
"Intangibles to Total Assets" = "0.0";
"Interest Coverage" = "0.0";
"Interest Debt per Share" = "24.0596";
"Invested Capital" = "292001000000.0";
"Market Cap" = "1012160744600.0";
"Net Current Asset Value" = "-85209000000.0";
"Net Debt to EBITDA" = "0.388";
"Net Income per Share" = "3.0476";
"Operating Cash Flow per Share" = "4.4335";
"PB ratio" = "11.1154";
"PE ratio" = "18.7109";
"PFCF ratio" = "17.5607";
"POCF ratio" = "14.5863";
"PTB ratio" = "11.1154";
"Payout Ratio" = "0.252";
"Price to Sales Ratio" = "3.8903";
"R&D to Revenue" = "0.0642";
"Revenue per Share" = "14.2602";
"SG&A to Revenue" = "0.0715";
"Shareholders Equity per Share" = "20.1496";
"Stock-based compensation to Revenue" = "0.0234";
"Tangible Asset Value" = "338516000000.0";
"Tangible Book Value per Share" = "75.38";
"Working Capital" = "57101000000.0";
date = "2019-09-28";
},
);
symbol = AAPL;
}
这是我的代码
func fetchFinancialMetrics(symbol:String) {
let url = URL(string: "https://financialmodelingprep.com/api/v3/company-key-metrics/\(symbol)?period=quarter")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil {
print ("ERROR")
} else {
if let content = data {
do {
let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
if let time = myJson["metrics"] as? NSDictionary {
for (key, value) in time {
if let value = value as? Dictionary<String, String> {
let date = value["date"]!
let revenuePerShare = value["Revenue per Share"]!
let netIncomePerShare = value["Net Income Per Share"]!
let operatingCashFlowPerShare = value["Operating Cash Flow per Share"]!
let freeCashFlowPerShare = value["Free Cash Flow per Share"]!
let cashPerShare = value["Cash per Share"]!
let bookValuePerShare = value["Book Value per Share"]!
let tangibleBookValuePerShare = value["Tangible Book Value per Share"]!
let shareholderEquityPerShare = value["Shareholders Equity per Share"]!
let interestDebtPerShare = value["Interest Debt per Share"]!
let marketCap = value["Market Cap"]!
let enterpriseValue = value["Enterprise Value"]!
let peRatio = value["PE ratio"]!
let priceToSalesRatio = value["Price to Sales Ratio"]!
let pocfRatio = value["POCF ratio"]!
let pfcfRatio = value["PFCF ratio"]!
let pbRatio = value["PB ratio"]!
let ptbRatio = value["PTB ratio"]!
let evToSales = value["EV to Sales"]!
let evOverEbitda = value["Enterprise Value over EBITDA"]!
let evToOperatingCashFlow = value["EV to Operating cash flow"]!
let evToFreeCashFlow = value["EV to Free cash flow"]!
let earningsYield = value["Earnings Yield"]!
let freeCashFlowYield = value["Free Cash Flow Yield"]!
let debtToEqutiy = value["Debt to Equity"]!
let debtToAssets = value["Debt to Assets"]!
let netDebtToEbitda = value["Net Debt to EBITDA"]!
let currentRatio = value["Current ratio"]!
let interestCoverage = value["Interest Coverage"]!
let incomeQuality = value["Income Quality"]!
let dividendYield = value["Dividend Yield"]!
let payoutRatio = value["Payout Ratio"]!
let sgaToRevenue = value["SG&A to Revenue"]!
let rdToRevenue = value["R&D to Revenue"]!
let intangiblesToTotalAssets = value["Intangibles to Total Assets"]!
let capexToOperatingCashFlow = value["Capex to Operating Cash Flow"]!
let capexToRevenue = value["Capex to Revenue"]!
let capexToDepreciation = value["Capex to Depreciation"]!
let stockBasedCompToRevenue = value["Stock-based compensation to Revenue"]!
let grahamNumber = value["Graham Number"]!
let grahamNetNet = value["Graham Net-net"]!
let workingCapital = value["Working Capital"]!
let tangibleAssetValue = value["Tangible Asset Value"]!
let netCurrentAssetValue = value["Net Current Asset Value"]!
let investedCapital = value["Invested Capital"]!
let averageReceivables = value["Average Receivables"]!
let averagePayables = value["Average Payables"]!
let averageInventory = value["Average Inventory"]!
let capexPerShare = value["Capex per Share"]!
// End of parse the individual components of the json and turn them into variables.
// Start of assigning the parsed individual components into an array
let dataCell = financialData(date: date, revenuePerShare: revenuePerShare, netIncomePerShare: netIncomePerShare, operatingCashFlowPerShare: operatingCashFlowPerShare, freeCashFlowPerShare: freeCashFlowPerShare, cashPerShare: cashPerShare, bookValuePerShare: bookValuePerShare, tangibleBookValuePerShare: tangibleBookValuePerShare, shareholderEquityPerShare: shareholderEquityPerShare, interestDebtPerShare: interestDebtPerShare, marketCap: marketCap, enterpriseValue: enterpriseValue, peRatio: peRatio, priceToSalesRatio: priceToSalesRatio, pocfRatio: pocfRatio, pfcfRatio: pfcfRatio, pbRatio: pbRatio, ptbRatio: ptbRatio, evToSales: evToSales, evOverEbitda: evOverEbitda, evToOperatingCashFlow: evToOperatingCashFlow, evToFreeCashFlow: evToFreeCashFlow, earningsYield: earningsYield, freeCashFlowYield: freeCashFlowYield, debtToEqutiy: debtToEqutiy, debtToAssets: debtToAssets, netDebtToEbitda: netDebtToEbitda, currentRatio: currentRatio, interestCoverage: interestCoverage, incomeQuality: incomeQuality, dividendYield: dividendYield, payoutRatio: payoutRatio, sgaToRevenue: sgaToRevenue, rdToRevenue: rdToRevenue, intangiblesToTotalAssets: intangiblesToTotalAssets, capexToOperatingCashFlow: capexToOperatingCashFlow, capexToRevenue: capexToRevenue, capexToDepreciation: capexToDepreciation, stockBasedCompToRevenue: stockBasedCompToRevenue, grahamNumber: grahamNumber, grahamNetNet: grahamNetNet, workingCapital: workingCapital, tangibleAssetValue: tangibleAssetValue, netCurrentAssetValue: netCurrentAssetValue, investedCapital: investedCapital, averageReceivables: averageReceivables, averagePayables: averagePayables, averageInventory: averageInventory, capexPerShare: capexPerShare)
financialArray.append(dataCell)
}
}
}
} catch {
print(error.localizedDescription)
}
}
}
}
task.resume()
}
答案 0 :(得分:0)
首先,这不是JSON,而是字典的描述。
第二,请阅读输出,()
代表一个数组,{}
一个字典。
所有第三种不使用NS...
集合类型。使用本机Swift类型。
所有mutableContainers
中的第四个在Swift中完全没有用,请省略该参数。
在有条件下调(as?
)之前的所有感叹号中的第五个毫无意义。
第六,第七,第八和第九个静音。
if let metrics = myJson["metrics"] as? [[String:String]] {
for dict in metrics {
let date = dict["date"]!
let revenuePerShare = dict["Revenue per Share"]!
...
使用Codable
协议解析JSON更加舒适(高效)。