【问题标题】:How to convert JSON array objects into list array | Swift 5 [closed]如何将 JSON 数组对象转换为列表数组 |斯威夫特 5 [关闭]
【发布时间】:2021-09-23 13:16:57
【问题描述】:

我有以下从 URL 解码的 JSON 数组,目前我能够解析数组以访问不可见对象,但是如何从 JSON 重新创建仅包含 trialid 的列表数组。 最终结果应如下所示:[27, 33]

以下是JSON数组的结构:

[
  {
    "name": "mobile",
    "orderid": 1,
    "trialid": 27
  },
  {
    "name": "mobile",
    "orderid": 1,
    "trialid": 33
  }
]

以下是我目前正在尝试的 - 如何在此处执行 foreach 以循环遍历每个对象:

var structure = [testStructure]()

func fetch() {
        guard let url = URL(string: "test.com")
        else { return }
        
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = "id=1".data(using: .utf8)
        URLSession.shared.dataTask(with: request) { data, _, error in
            guard let data = data else { return }
            
            do {
                let nav  = try JSONDecoder().decode(structure, from: data)
                
              
                    
                
            }
            catch {
                print(error)
            }
            
        }.resume()
        
    }


 struct testStructure: Decodable {
    let name: String?
    let orderid: Int?
    let trialid: Int?
}

更新:

转换为列表数组后,我将执行以下操作以从 Storyboards 启动视图控制器

   case .success( let data):
        do {
            let nav = try JSONDecoder().decode([TestStructure].self, from: data)
            self.viewControllers = (nav.map(\.trialid)) { "\($0)" }.map {
                
                let selected = UIImage(named: "Tab4_Large")!
                let normal = UIImage(named: "Tab4_Large")!
                let controller = storyboard!.instantiateViewController(withIdentifier: $0)
                controller.view.backgroundColor = UIColor.white
                controller.floatingTabItem = FloatingTabItem(selectedImage: selected, normalImage: normal)
                return controller
            }
            
        }
        
        catch {print(error)}

这是为了整体建立一个自定义导航栏

问题 1:

无法推断复杂的闭包返回类型;添加显式类型 消除歧义

问题 2:

不能调用非函数类型'[Int?]'的值

【问题讨论】:

  • 看到这个答案stackoverflow.com/a/48023537/6884584。你的解码应该是let nav = try JSONDecoder().decode([TestStructure].self, from: data)。此外,对象类型应以大写字母 (struct TestStructure) 开头。还建议查看swift.org/documentation/api-design-guidelines 以确保一些良好做法;)。
  • @AlexIoja-Yang 请查看我的更新帖子,感谢您的帮助
  • 大约 12 小时前您已经有了相同的主题。为什么不编辑最后一个而不是打开一个新的?

标签: swift


【解决方案1】:

首先,请始终以大写字母开头命名结构和类,如果 API 发送一致的数据,则声明结构成员非可选

struct TestStructure: Decodable {
    let name: String
    let orderid: Int
    let trialid: Int
}

所有解码行的第二行没有编译,你必须写

let nav = try JSONDecoder().decode([TestStructure].self, from: data)

要获取所有 trialid 值的数组,只需 map

let allTrialids = nav.map(\.trialid)

更新:采纳编译器的建议并添加显式类型以消除歧义

self.viewControllers = nav.map { test -> UIViewController in
    let selected = UIImage(named: "Tab4_Large")!
    let normal = UIImage(named: "Tab4_Large")!
    let controller = storyboard!.instantiateViewController(withIdentifier: String(test.trialid))
    controller.view.backgroundColor = UIColor.white
    controller.floatingTabItem = FloatingTabItem(selectedImage: selected, normalImage: normal)
    return controller
}

【讨论】:

  • 感谢您的帮助-您能看到我更新的帖子吗,我有点困惑如何使用数组列表来启动视图控制器。我的原始代码具有以下静态值,没有问题viewControllers = (1...4).map { "Tab\($0)" }.map {
  • 我完全理解这个问题与原文有点偏离主题,但感谢任何指导。谢谢
  • 查看更新。其实你只需要一个 map
  • 我收到以下错误:let controller = storyboard!.instantiateViewController(withIdentifier: String(test.trialid))
  • 对初始化程序的调用没有完全匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2015-06-07
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多