无法将 json 对象转换为结构
Cannot convert json object to struct
我想将 json 从以下 url 转换为结构。但是,我收到错误 Could not cast value of type '__NSArrayI' to 'NSData'
这是示例 json 数据 https://jsonplaceholder.typicode.com/posts
的 url
这是结构
struct GetHelp: Codable {
var id: Int
var userId: Int
var title: String
var body: String
}
这里是服务器通信
AF.request("https://jsonplaceholder.typicode.com/posts")
.responseJSON { response in
switch response.result {
case let .success(value):
do {
let decoder = JSONDecoder()
let model = try decoder.decode([GetHelp].self, from: value as! Data)
print(model)
} catch let parsingError {
print("Error", parsingError)
}
case let .failure(error): print(error)
}
}
此外,如果您删除value as! Data
,则会出现以下错误。
Cannot convert value of type 'Any' to expected argument type 'Data'
我收到错误的原因是什么以及如何解决这个问题?
你必须通过 .responseData
而不是 .responseJSON
来获取原始数据,.responseJSON
returns 一个集合类型。
AF.request("https://jsonplaceholder.typicode.com/posts")
.responseData { response in
switch response.result {
case let .success(value):
do {
let decoder = JSONDecoder()
let model = try decoder.decode([GetHelp].self, from: value)
print(model)
} catch {
print("Error", error)
}
case let .failure(error): print(error)
}
}
要将字典数组与 .responseJSON
一起使用,您必须在代码中将数组映射到您的模型
AF.request("https://jsonplaceholder.typicode.com/posts")
.responseJSON { response in
switch response.result {
case let .success(value):
if let array = value as? [[String:Any]] {
let model = array.map { GetHelp(id: [=11=]["id"] as! Int,
userId: [=11=]["userId"] as! Int,
title: [=11=]["title"] as! String,
body: [=11=]["body"] as! String)}
print(model)
}
case let .failure(error): print(error)
}
}
即使使用 responseJSON 块,您也可以直接从响应中获取数据
request("https://jsonplaceholder.typicode.com/posts")
.responseJSON { response in
switch response.result {
case let .success(value):
do {
let decoder = JSONDecoder()
if let data = response.data {
let model = try decoder.decode([GetHelp].self, from: data)
print(model)
}
} catch let parsingError {
print("Error", parsingError)
}
case let .failure(error): print(error)
}
}
无需在 Alamofire 5 中手动处理 Decodable
响应,您现在可以直接处理:
AF.request("https://jsonplaceholder.typicode.com/posts")
.responseDecodable(of: GetHelp.self) { response in
switch response.result {
case let .success(value): print(value)
case let .failure(error): print(error)
}
}
我想将 json 从以下 url 转换为结构。但是,我收到错误 Could not cast value of type '__NSArrayI' to 'NSData'
这是示例 json 数据 https://jsonplaceholder.typicode.com/posts
这是结构
struct GetHelp: Codable {
var id: Int
var userId: Int
var title: String
var body: String
}
这里是服务器通信
AF.request("https://jsonplaceholder.typicode.com/posts")
.responseJSON { response in
switch response.result {
case let .success(value):
do {
let decoder = JSONDecoder()
let model = try decoder.decode([GetHelp].self, from: value as! Data)
print(model)
} catch let parsingError {
print("Error", parsingError)
}
case let .failure(error): print(error)
}
}
此外,如果您删除value as! Data
,则会出现以下错误。
Cannot convert value of type 'Any' to expected argument type 'Data'
我收到错误的原因是什么以及如何解决这个问题?
你必须通过 .responseData
而不是 .responseJSON
来获取原始数据,.responseJSON
returns 一个集合类型。
AF.request("https://jsonplaceholder.typicode.com/posts")
.responseData { response in
switch response.result {
case let .success(value):
do {
let decoder = JSONDecoder()
let model = try decoder.decode([GetHelp].self, from: value)
print(model)
} catch {
print("Error", error)
}
case let .failure(error): print(error)
}
}
要将字典数组与 .responseJSON
一起使用,您必须在代码中将数组映射到您的模型
AF.request("https://jsonplaceholder.typicode.com/posts")
.responseJSON { response in
switch response.result {
case let .success(value):
if let array = value as? [[String:Any]] {
let model = array.map { GetHelp(id: [=11=]["id"] as! Int,
userId: [=11=]["userId"] as! Int,
title: [=11=]["title"] as! String,
body: [=11=]["body"] as! String)}
print(model)
}
case let .failure(error): print(error)
}
}
即使使用 responseJSON 块,您也可以直接从响应中获取数据
request("https://jsonplaceholder.typicode.com/posts")
.responseJSON { response in
switch response.result {
case let .success(value):
do {
let decoder = JSONDecoder()
if let data = response.data {
let model = try decoder.decode([GetHelp].self, from: data)
print(model)
}
} catch let parsingError {
print("Error", parsingError)
}
case let .failure(error): print(error)
}
}
无需在 Alamofire 5 中手动处理 Decodable
响应,您现在可以直接处理:
AF.request("https://jsonplaceholder.typicode.com/posts")
.responseDecodable(of: GetHelp.self) { response in
switch response.result {
case let .success(value): print(value)
case let .failure(error): print(error)
}
}