如何使用 swift 在折线图中显示 json 数据
How to show json data in line chart with swift
我是 ios 应用程序的新手,正在编写一个显示 api json 数据的简单应用程序。
我目前遇到的问题是我想在视图中显示json数据,使用折线图渲染
首先,这是我的json数据。
{
TH_5min: [
{
Data: "2019-02-23T00:00:00",
Time: "11:00:00",
XTP_A: 10.5, //temperature 1
XHP_A: 11.5, //humidity 1
XTP_B: 33.5,
XHP_B: 44.6,
XTP_C: 88.9,
XHP_C: 66.6,
XTP_D: 77.9,
XHP_D: 99.6,
XTP_E: 87.87,
XHP_E: 66.66
},
{
Data: "2019-02-23T00:00:00",
Time: "11:05:00",
XTP_A: 55.2, //temperature 1
XHP_A: 44.3, //humidity 1
XTP_B: 66.6,
XHP_B: 77.87,
XTP_C: 87.77,
XHP_C: 87.87,
XTP_D: 8.87,
XHP_D: 78.78,
XTP_E: 87.78,
XHP_E: 87.87
}
]
}
这是我读取json数据并存储的格式,使用swift代码
private var th_5mins = [Th_5min]()
@objc func getlatestTh_5min(){
guard let th_5minUrl = URL(string: kivaLoanURl) else{
return
}
let request = URLRequest(url: th_5minUrl)
let task = URLSession.shared.dataTask(with: request, completionHandler: {(data,response,error) -> Void in
if let error = error {
print(error)
return
}
if let data = data {
self.th_5mins = self.pardrJsonData(data: data)
}
})
task.resume()
}
func pardrJsonData(data: Data) -> [Th_5min]{
var th_5mins = [Th_5min]()
do {
let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
let jsonTh_5mins = jsonResult?["TH_5min"] as! [AnyObject]
for jsonTh_5min in jsonTh_5mins{
var th_5min = Th_5min()
th_5min.Data = jsonTh_5min["Data"] as! String
th_5min.Time = jsonTh_5min["Time"] as! String
th_5min.XTP_A = jsonTh_5min["XTP_A"] as! Double
th_5min.XHP_A = jsonTh_5min["XHP_A"] as! Double
th_5mins.append(th_5min)
} }catch{
print(error)
}
return th_5mins
}
}
这是我目前实现的折线图方法,使用swift代码
override func viewDidLoad() {
super.viewDidLoad()
getlatestTh_5min()
//
chartView = LineChartView()
chartView.frame = CGRect(x: 20, y: 80, width: self.view.bounds.width - 40,height: 300)
self.view.addSubview(chartView)
//Generate data for the first line chart
var dataEntries1 = [ChartDataEntry]()
for i in 0...5 {
let y = Th_5min().XTP_A
let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
dataEntries1.append(entry)
}
let chartDataSet1 = LineChartDataSet(entries: dataEntries1, label: "溫度")
//Generate data for the second line chart
var dataEntries2 = [ChartDataEntry]()
for i in 0..<8 {
let y = arc4random()%100
let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
dataEntries2.append(entry)
}
let chartDataSet2 = LineChartDataSet(entries: dataEntries2, label: "濕度")
//
let chartData = LineChartData(dataSets: [chartDataSet1, chartDataSet2])
//show line chart data
chartView.data = chartData
}
目前的结果只是成功显示的第二行,并不是我想要的数据。我只有一个随机值来显示数据。第一个,无论您如何尝试,图表中的 json 数据都不会丢失。我想实现它。 api抓取的所有数据(温度1,湿度1)都丢进折线图中,一个显示温度,一个显示湿度,json的时间显示在上面的X -axis部分,但是现在怎么把json扔到图表上我不知道该怎么办,请帮帮我!
这里有两个明显的问题。
- 在
viewDidLoad()
开始,调用函数下载JSON数据。然后您立即尝试绘制数据。这将不起作用,因为 JSON 数据下载是一个异步过程,并且不会在函数 returns 时完成。此时您将无法访问下载的数据。要解决此问题,请将绘图代码从 viewDidLoad()
移动到单独的函数,并在下载和解析数据后调用该函数(即在 pardrJsonData
的末尾)。
- 绘图代码不使用您在
pardrJsonData
中创建的已下载解析 JSON。此函数填充 th_5mins
数组,但随后未使用它。绘图代码包括 let y = Th_5min().XTP_A
,但这会创建该值的一个新实例并绘制其默认初始化的 XTP_A
值。将此行替换为 let y = th_5mins[i].XTP_A
。但是,我会将循环限制从硬编码的 5 更改为 for i in 0..<th_5mins.count
.
我是 ios 应用程序的新手,正在编写一个显示 api json 数据的简单应用程序。 我目前遇到的问题是我想在视图中显示json数据,使用折线图渲染
首先,这是我的json数据。
{
TH_5min: [
{
Data: "2019-02-23T00:00:00",
Time: "11:00:00",
XTP_A: 10.5, //temperature 1
XHP_A: 11.5, //humidity 1
XTP_B: 33.5,
XHP_B: 44.6,
XTP_C: 88.9,
XHP_C: 66.6,
XTP_D: 77.9,
XHP_D: 99.6,
XTP_E: 87.87,
XHP_E: 66.66
},
{
Data: "2019-02-23T00:00:00",
Time: "11:05:00",
XTP_A: 55.2, //temperature 1
XHP_A: 44.3, //humidity 1
XTP_B: 66.6,
XHP_B: 77.87,
XTP_C: 87.77,
XHP_C: 87.87,
XTP_D: 8.87,
XHP_D: 78.78,
XTP_E: 87.78,
XHP_E: 87.87
}
]
}
这是我读取json数据并存储的格式,使用swift代码
private var th_5mins = [Th_5min]()
@objc func getlatestTh_5min(){
guard let th_5minUrl = URL(string: kivaLoanURl) else{
return
}
let request = URLRequest(url: th_5minUrl)
let task = URLSession.shared.dataTask(with: request, completionHandler: {(data,response,error) -> Void in
if let error = error {
print(error)
return
}
if let data = data {
self.th_5mins = self.pardrJsonData(data: data)
}
})
task.resume()
}
func pardrJsonData(data: Data) -> [Th_5min]{
var th_5mins = [Th_5min]()
do {
let jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
let jsonTh_5mins = jsonResult?["TH_5min"] as! [AnyObject]
for jsonTh_5min in jsonTh_5mins{
var th_5min = Th_5min()
th_5min.Data = jsonTh_5min["Data"] as! String
th_5min.Time = jsonTh_5min["Time"] as! String
th_5min.XTP_A = jsonTh_5min["XTP_A"] as! Double
th_5min.XHP_A = jsonTh_5min["XHP_A"] as! Double
th_5mins.append(th_5min)
} }catch{
print(error)
}
return th_5mins
}
}
这是我目前实现的折线图方法,使用swift代码
override func viewDidLoad() {
super.viewDidLoad()
getlatestTh_5min()
//
chartView = LineChartView()
chartView.frame = CGRect(x: 20, y: 80, width: self.view.bounds.width - 40,height: 300)
self.view.addSubview(chartView)
//Generate data for the first line chart
var dataEntries1 = [ChartDataEntry]()
for i in 0...5 {
let y = Th_5min().XTP_A
let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
dataEntries1.append(entry)
}
let chartDataSet1 = LineChartDataSet(entries: dataEntries1, label: "溫度")
//Generate data for the second line chart
var dataEntries2 = [ChartDataEntry]()
for i in 0..<8 {
let y = arc4random()%100
let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
dataEntries2.append(entry)
}
let chartDataSet2 = LineChartDataSet(entries: dataEntries2, label: "濕度")
//
let chartData = LineChartData(dataSets: [chartDataSet1, chartDataSet2])
//show line chart data
chartView.data = chartData
}
目前的结果只是成功显示的第二行,并不是我想要的数据。我只有一个随机值来显示数据。第一个,无论您如何尝试,图表中的 json 数据都不会丢失。我想实现它。 api抓取的所有数据(温度1,湿度1)都丢进折线图中,一个显示温度,一个显示湿度,json的时间显示在上面的X -axis部分,但是现在怎么把json扔到图表上我不知道该怎么办,请帮帮我!
这里有两个明显的问题。
- 在
viewDidLoad()
开始,调用函数下载JSON数据。然后您立即尝试绘制数据。这将不起作用,因为 JSON 数据下载是一个异步过程,并且不会在函数 returns 时完成。此时您将无法访问下载的数据。要解决此问题,请将绘图代码从viewDidLoad()
移动到单独的函数,并在下载和解析数据后调用该函数(即在pardrJsonData
的末尾)。 - 绘图代码不使用您在
pardrJsonData
中创建的已下载解析 JSON。此函数填充th_5mins
数组,但随后未使用它。绘图代码包括let y = Th_5min().XTP_A
,但这会创建该值的一个新实例并绘制其默认初始化的XTP_A
值。将此行替换为let y = th_5mins[i].XTP_A
。但是,我会将循环限制从硬编码的 5 更改为for i in 0..<th_5mins.count
.