在 SWIFT 4 中获取超出本地范围的 JSON 数据

Getting JSON data out of local scope in SWIFT 4

因此,几天来我一直在努力使这段代码正常工作,但我不知道自己做错了什么。

我正在从网上获取 JSON 并使用 Struct 块对其进行解析。

问题是:我想使用 JSON 中创建解码函数的字典和数组。

这是代码

import UIKit


struct  Currency_format: Decodable{
    var iso_code: String
    var example_format : String
    var decimal_digits : Int
    var decimal_separator : String
    var symbol_first : Bool
    var group_separator : String
    var currency_symbol : String
    var display_symbol : Bool
}

struct  Date_Format: Decodable{
    var format : String
}

struct Budgets: Decodable {
    var id : String
    var name: String
    var last_modified_on : String
    var first_month : String
    var last_month : String
    var date_format : Date_Format
    var currency_format : Currency_format
}

struct DataResponse : Decodable {
    var data : Data
}

struct Data : Decodable{
    var budgets : [Budgets]
}


class ViewController: UIViewController {


override func viewDidLoad() {
    super.viewDidLoad()
    let accessToken = "1234"
    let authorizationRequestHeader = "https://www.somewhere.com=\(accessToken)"


    guard let url = URL(string: authorizationRequestHeader) else {
        print("Error")
        return
    }
    let session = URLSession.shared
    session.dataTask(with: url) { (stringData, response, Error) in
        let testString =  try! dataResponse.decode(DataResponse.self, from:stringData!)
        print("Number of records: \(testString.data.budgets.count)")
        //THIS PRINT WORKS AS I WANT IT TO WORK. NOT PROBLEM HERE
        }.resume()

  print("Number of records: \(testString.data.budgets.count)") // BUT THE SAME CODE HERE, DOES NOT WORK AT ALL

做一件事,在 viewDidLoad() 之前初始化 testString 喜欢:

class ViewController: UIViewController {

let testString : DataResponse!

override func viewDidLoad() {
super.viewDidLoad()
    let accessToken = "1234"
    let authorizationRequestHeader = "https://www.somewhere.com=\(accessToken)"


    guard let url = URL(string: authorizationRequestHeader) else {
        print("Error")
        return
    }
    let session = URLSession.shared
    session.dataTask(with: url) { (stringData, response, Error) in
        testString =  try! dataResponse.decode(DataResponse.self, from:stringData!)
        print("Number of records: \(testString.data.budgets.count)")

    }.resume()


print("Number of records: \(testString.data.budgets.count)")
}

希望这对您有所帮助。

JSON 解码器方法无法正常使用 JSON 中可用的 snake_case 键。要正常工作,在这种情况下我们必须使用 CodingKeys 方法。

有关详细信息,请参阅此 documentation