0

所以,我一直试图让这段代码工作几天,但我不知道我做错了什么。

我从网上获取一个 JSON 并用 Struct 块解析它。

问题是:我想使用我创建 de decode 函数的 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
4

2 回答 2

0

做一件事,在 LiketestString之前初始化:viewDidLoad()

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)")
}

希望这会有所帮助。

于 2018-07-13T04:08:17.813 回答
0

JSON 解码器方法不适用于 JSON 中可用的 snake_case 键。为了例外地工作,在这种情况下,我们必须使用 CodingKeys 方法。

有关详细信息,请参阅此文档

于 2018-07-13T07:09:01.490 回答