当前位置: 首页 > 知识库问答 >
问题:

如何在Swift中拆分JSON字符串?[副本]

米修平
2023-03-14

我正在编写一个应用程序,它从Timezonedb API中提取数据,以获得可用时区列表:

https://timezonedb.com/references/list-time-zone

{
"status":"OK",
"message":"",
"zones":[
    {
        "countryCode":"AD",
        "countryName":"Andorra",
        "zoneName":"Europe\/Andorra",
        "gmtOffset":7200,
        "timestamp":1464453737
    },
    {
        "countryCode":"AE",
        "countryName":"United Arab Emirates",
        "zoneName":"Asia\/Dubai",
        "gmtOffset":14400,
        "timestamp":1464460937
    },
    {"
        countryCode":"AF",
        "countryName":"Afghanistan",
        "zoneName":"Asia\/Kabul",
        "gmtOffset":16200,
        "timestamp":1464462737
    }]}
struct TimeZones: Codable {
let status, message: String?
let zones: [Zone]?
}

struct Zone: Codable {
let countryCode, countryName, zoneName: String?
let gmtOffset, timestamp: Int?
}
var cities: [Zone] = []

   func getAvailableTimeZones() {

    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)
    let url = Bundle.main.url(forResource: "data", withExtension: "json")!

    let task = session.dataTask(with: url) { data, response, error in

        // Check for errors
        guard error == nil else {
            print ("error: \(error!)")
            return
        }
        // Check that data has been returned
        guard let content = data else {
            print("No data")
            return
        }

        do {
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            let timeZones = try decoder.decode(TimeZones.self, from: content)

            if let zones = timeZones.zones {
                self.cities.append(contentsOf: zones)
            }

        } catch let err {
            print("Err", err)
        }
    }
    // Execute the HTTP request
    task.resume()
}

TableViewController:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "searchResultsCell", for: indexPath)

    cell.textLabel?.text = cities[indexPath.row].zoneName

    return cell
}

感谢任何帮助。谢谢你。

共有1个答案

卢健
2023-03-14

一个解决方案是添加codingkeys和一个计算属性。

并且没有理由将结构成员声明为可选

struct TimeZones: Decodable {
   let status, message: String 
   let zones: [Zone]
}

struct Zone: Decodable {
    let countryCode, countryName, zoneName: String
    let gmtOffset, timestamp: Int

    private enum CodingKeys: String, CodingKey { case countryCode, countryName, zoneName, gmtOffset, timestamp}

    lazy var zoneCountry : String = {
       return zoneName.components(separatedBy: "/").last!
    }()
}

然后使用它

cell.textLabel?.text = cities[indexPath.row].zoneCountry
 类似资料:
  • 我不想拆分我的字符串,以便hello的值得到“hello”,而hi的值得到“hi”

  • 我正在使用拆分一个字符串。我收到的字符串有这样的结构: 其中<代码> 除非是空字符串,否则这可以正常工作。在这种情况下,只会跳过数据。 我想要一个字符串,如<代码>[数据] 我该怎么做?

  • 我有一个字符串,,我想把它分成两个字符串: 这意味着第一个字符串将包含之前的字符,第二个字符串将包含之后的字符。我还想检查字符串中是否有。如果没有,我会抛出一个异常。我该如何做到这一点?

  • 假设我们有以下字符串: 我需要将它们分开,以获得以下结果: 你会怎么做?

  • 问题内容: 说我在这里有一个字符串: 我想在空白处分割字符串并将值分配给它们各自的变量 此外,有时用户可能没有姓氏。 问题答案: Swift的方法是使用全局函数,如下所示: 与 Swift 2 在Swift 2中,由于引入了内部CharacterView类型,对split的使用变得更加复杂。这意味着String不再采用SequenceType或CollectionType协议,而必须使用该属性来访

  • 问题内容: let string = “hello hi” var hello = “” var hi = “” 我不会分割字符串,以便hello的值获得“ hello”,hi的值获得“ hi” 问题答案: 试试这个: 字符串的名称在哪里,并且包含由空格分隔的组件。 然后,您可以将组件获取为: Doc:componentsSeparatedByString 编辑: 对于Swift 3,以上将是: