预期解码Dictionary <String,Any>,但找到一个数字

时间:2019-08-04 23:59:43

标签: json swift api decodable

使用快速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]

}

1 个答案:

答案 0 :(得分:0)

您的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()
}