我的精力和时间很耗时,现在完成该项目,我已竭尽所能来学习,理解和实施解决方案,但均未成功,我真的希望对此有所帮助。有人对实施解决方案有任何想法吗?
我真的很努力将json文件解析到Swift中的iOS应用中。 我有一个SQL数据库的JSON输出。我认为格式是错误的,并且数据头有点模棱两可,但是我聘请的创建该过程的开发人员对输出感到满意。链接下面。
因此,在过去的三天内,我阅读了有关解析JSON的所有Apple Developer材料,还观看了许多教程,这些教程几乎涵盖了相同的数据,而且我不知道我已经阅读了多少内容并将其转换为实际数据。所有失败的项目。我真的需要一些指导。我什至试图从不同的角度来理解我的问题,我也用其他语言看待它是如何完成的。 这是最新的迭代:
导入UIKit 导入基金会
struct ScheduleList: Codable {
let data: [Datum]
enum CodingKeys: String, CodingKey {
case data = "data"
}
}
struct Datum: Codable {
let date: String
let message: String
let notice: String
enum CodingKeys: String, CodingKey {
case date = "date"
case message = "message"
case notice = "notice"
}
}
class VCMainViewController: UIViewController {
@IBOutlet weak var flightTable: UITableView!
@IBOutlet weak var date: UILabel!
@IBOutlet weak var route: UILabel!
@IBOutlet weak var std: UILabel!
@IBOutlet weak var sta: UILabel!
@IBOutlet weak var pax: UILabel!
let flight = [Datum]()
func parse() {
let jsonUrlString = "http://35.237.114.234/api/index.php?uid=Bx7faf08A9fYJ7bZCNMUX9EzxYN2"
guard let url = URL(string: jsonUrlString) else { return }
let task = URLSession.shared.scheduleListTask(with: url) { (scheduleList, response, error) in
guard let scheduleList = scheduleList, error == nil, response != nil else {
print("Something Wrong")
return
}
print("downlaoded")
do {
let decoder = JSONDecoder()
//Error Here: Cannot convert value of type 'ScheduleList' to expected argument type 'Data'
let downloadedFlights = try decoder.decode([scheduleList], from: scheduleList)
self.flight = downloadedFlights.date
} catch {
print("Something wrong after loading")
}
}
//I find I can print data / scheduleList here and it still returns correct data. So something above I guess is the problem.
task.resume()
/*
if scheduleList != nil {
print(scheduleList!)
} else {
print(error)
}
}
*/
}
override func viewDidLoad() {
super.viewDidLoad()
parse()
}
}
**由于原始帖子的问题,现在添加了完整的JSON文件。
我认为结构是问题。 有什么建议我要去哪里吗?我无法将其转换为Data,dataTask数据称为scheduleList,所以我不知道为什么它不接受它。
谢谢
答案 0 :(得分:2)
只需将您的后两个字符从],
更改为]}
,您将拥有有效的JSON。
它甚至可能起作用:)
如果没有,请回传确切的错误消息,以及失败的那一行。
同样,方便使用JSON格式器/浏览器/验证器也不错。我通常使用Notepad ++插件。这是一个不错的在线浏览器:
另请参阅:
Stack Overflow: How to create a Minimal, Complete, and Verifiable example
答案 1 :(得分:1)
在Swift 4.1中处理JSON的新方法是使用Codable
协议(或其子变量Encodable
和Decodable
)。要将JSON字符串转换为实际对象,应使用Decodable
。
//: Playground - noun: a place where people can play
import UIKit
import Foundation
struct Message: Decodable {
let date: String
let message: String
let notice: String
}
struct Flight: Decodable {
let flight: String
let aircraft: String
let operating: String
let type: String
let route: String
let std: String
let sta: String
let pax: String
let prm: String
let check: String
}
struct Response: Decodable {
let data: [Message]
let flights: [Flight]
let state: String
private enum CodingKeys: String, CodingKey {
case data, state
case flights = "flight" // Parses "flight" from the response to the flights property
}
}
// Get a String from your JSON and convert it to Data
let jsonString = "..."
let jsonData = jsonString.data(using .utf8)!
// Initialize the decoder
let decoder = JSONDecoder()
// Try to convert your JSON to objects
do {
let response = try decoder.decode(Response.self, from: jsonData)
print("Decoded successfully: \(response)")
// Access values as usual with a struct... well, this IS a Swift struct already
print("State: \(response.state)")
// etc...
} catch {
print("Error decoding: \(error)")
}
在此处查看Apple文档: