json - 预计解码字典但找到了一个号码
问题描述
使用 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]
}
解决方案
你的 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()
}
推荐阅读
- python - 如何用熊猫清理csv中间的额外标题信息
- python - window10 系统找不到指定的路径,但路径已添加
- java - 如何在 Java 中使用 MLeap DenseTensor
- django - Django 频道加载以前的消息
- boto3 - Boto3:调用TagResource操作时:标记操作必须使用Long arn格式
- c# - webconfig 规则中通配符 url 的 301 重定向
- python - Heroku - 进程以状态 255 退出
- sql - psycopg2 copy_from Python 3 中的问题
- angularjs - Angular.merge 不是 angularjs 图表集成中显示的函数
- ionic-framework - 什么是 Ionicframework 的良好开发设置