但找到了一个号码,json,swift,api,decodable"/>

首页 > 解决方案 > 预计解码字典但找到了一个号码

问题描述

使用 swift 5 结果类型解析 JSON 时遇到问题。这是导致错误的以下代码。

这是我的示例 JSON 数据。

[
  9129911,
  9129199,
  9127761,
  9128141,
  9128264,
  9127792,
  9129248,
  9127092,
  9128367,
  9038733
]

这是我的感染代码。

func fetchData(completion: @escaping (Result<[news],Error>) -> Void){
      guard let url = URL(string: base_URL) else { return }
      URLSession.shared.dataTask(with: url) { (data, _, error) in

        if let error = error {
          completion(.failure(error))
          return
        }

        guard let jsonData = data else { return }
        do {

          let info = try JSONDecoder().decode([news].self, from: jsonData)
          //let userId = info
          completion(.success(info))

        }catch let error {
          completion(.failure(error))
        }


        }.resume()
    }

我正在调用这个函数

FetchData { (result) in
      switch result {
      case .success(let info):
          self.users = info
            print(self.users)
      case .failure( let error):
          print(error)
      }
    } 

我的 self.users 代表

var users = [news]()

我的结构是->

struct news: Decodable {

  let id: [Int]

}

标签: jsonswiftapidecodable

解决方案


你的 JSON 是一个简单的整数数组,所以你应该像这样解码它:

let info = try JSONDecoder().decode([Int].self, from: jsonData)

一个[news]数组将对应一个 JSON 结构,如下所示:

[
    {
        "id": [1,2,3]
    },
    {
        "id": [4,5,6]
    }
]

它们非常不同。

我建议您将news结构更改为以下内容:

struct News {
    let id: Int
}

然后解码后,可以将解码后的数据转换成[News]这样的:

func fetchData(completion: @escaping (Result<[News],Error>) -> Void){
  guard let url = URL(string: base_URL) else { return }
  URLSession.shared.dataTask(with: url) { (data, _, error) in

    if let error = error {
      completion(.failure(error))
      return
    }

    guard let jsonData = data else { return }
    do {

      let arrayOfInts = try JSONDecoder().decode([Int].self, from: jsonData)
      let info = arrayOfInts.map(News.init)
      completion(.success(info))

    }catch let error {
      completion(.failure(error))
    }


    }.resume()
}

推荐阅读