在Swift中分析24小时问题中的JSON

时间:2018-07-03 20:20:04

标签: ios json swift parsing

我的精力和时间很耗时,现在完成该项目,我已竭尽所能来学习,理解和实施解决方案,但均未成功,我真的希望对此有所帮助。有人对实施解决方案有任何想法吗?

我真的很努力将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,所以我不知道为什么它不接受它。

谢谢

2 个答案:

答案 0 :(得分:2)

只需将您的后两个字符从],更改为]},您将拥有有效的JSON。

它甚至可能起作用:)

如果没有,请回传确切的错误消息,以及失败的那一行。

同样,方便使用JSON格式器/浏览器/验证器也不错。我通常使用Notepad ++插件。这是一个不错的在线浏览器:

JSON formatter and validator

另请参阅:

Stack Overflow: How to create a Minimal, Complete, and Verifiable example

答案 1 :(得分:1)

在Swift 4.1中处理JSON的新方法是使用Codable协议(或其子变量EncodableDecodable)。要将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文档:

1)Encoding and Decoding Custom Types

2)JSONDecoder