将JSON解析为正确的结构体格式

uttx8gqw  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(144)

作为swiftUI开发的新手,目前还不太了解,如果这个问题已经得到了回答,我很抱歉,但我找不到(或至少不理解)任何东西来解决我的问题。为了练习,我试图创建第一个应用程序,一个标志测验。虽然可能很容易做到,但我很难回答这两个问题:
1.存储旗帜图像的最佳解决方案是什么?如果我需要为应用程序创建更多功能,将其存储在资产文件夹中,尝试从API中检索它们或将其存储在免费的后端服务中,如Firebase?
1.我去了我这边的API解决方案,但我很难得到它正确地完成.我想有一个数组的“标志”结构允许我随机选择一个“标志”显示在视图中与其相关联的“shortName”(从URL检索正确的标志)和“名称”.这是我到目前为止:

import Foundation

let decoder = JSONDecoder()

struct Flag: Codable, Identifiable {
    var flagLink: String
    var flagDetails: FlagDetails
    var id = UUID()
    
    init(flagLink: String, flagDetails: FlagDetails) {
        self.flagDetails = flagDetails
        self.flagLink = "https://flagcdn.com/w320/\(flagDetails.shortName).png"
    }
}

struct FlagDetails: Codable {
    var shortName: String
    var name: String
}

func getJSON(){
    
    guard let urlJSON = URL(string: "https://flagcdn.com/fr/codes.json") else {
        print("Invalid URL")
        return
    }
    URLSession.shared.dataTask(with: urlJSON) { (data, response, error) -> Void in
        if error == nil && data != nil {
            do {
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: Any]
                print()
    
            } catch {
                print("Invalid data: \(error)")
            }
        }
    }.resume()
}

网站提供的JSON文件如下格式:

{
    "ad": "Andorra",
    "af": "Afghanistan",
    "ag": "Antigua-et-Barbuda",
    "ai": "Anguilla"
}

创建字典后,我想将CodingKey分配给“shortName”,将CodingKey的值分配给“name”,以便在从视图中请求随机问题时正确初始化链接。我很确定这绝对不是最好的方法,但作为一个真正的初学者,使用JSON文件可以帮助我很多。
非常感谢您提供的任何帮助!

thtygnil

thtygnil1#

1.我会使用一个框架来下载图像,比如Kingfisher或ImageLoaderSwift。
1.至于回答你的第二个问题:
您可以使用for KEY in DICTIONARY遍历字典,然后将值添加到数组(countryFlags)中。
只有当你可以直接将json字符串转换为结构体时,你才需要Codable,在这种情况下你不能,因为你需要一个数组而不是字典。
请注意,我没有Mac,所以我不能测试代码。

struct Flag {
  /.../

  // Simplified constructor for you
  init(shortName: String, name: String) {
      self.flagDetails = FlagDetail(shortName: shortName, name: name)
      self.flagLink = "https://flagcdn.com/w320/\(shortName).png"
  }
}

struct FlagDetails {
    /.../
}

var countryFlags = [Flag]()

func getJSON(){
    
    guard let urlJSON = URL(string: "https://flagcdn.com/fr/codes.json") else {
        print("Invalid URL")
        return
    }

    URLSession.shared.dataTask(with: urlJSON) { (data, response, error) -> Void in
        if error == nil && data != nil {
            do {
                // Changed [String: Any] to [String: String]
                let countryDictionary = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: String]

                // NEW CODE
                for (shortName, name) in countryDictionary {
                  countryFlags.append( Flag(shortName: shortName, name: name) )
                }

                print(countryFlags)

            } catch {
                print("Invalid data: \(error)")
            }
        }
    }.resume()
}

相关问题