Я хочу быстро преобразовать строку json в объект с универсальным типом. технически у меня есть класс GenricResponse, и этот класс имеет свойство Generic, в этом свойстве это будет класс JsonWebToken (JwtResponse). JwtResponse имеет еще два класса (JwtDecode и Usuarios). когда программа пытается преобразовать данные в объект, я получаю сообщение об ошибке преобразования: Не удалось декодировать ответ в заданный тип
насколько я понимаю json соответствует структуре объекта: GenericResponse
это мой класс GenericResponse
import Foundation
import SwiftUI
class GenericResponse: Codable {
var message: String?;
var response: String?;
var data: T?;
}
Класс JwtResponse:
import Foundation
import Swift
struct JwtResponse: Codable {
var jwtEncode: String;
var jwtDecode: JwtDecode;
var usuario: Usuarios;
}
Класс JwtDecode:
import Foundation
import SwiftUI
class JwtDecode : Codable {
var iat: Int;
var iss: String;
var nbf: Int;
var exp: Int;
var email: String;
var username: String;
}
класс Усуариос:
import Foundation
import Swift
class Usuarios: Codable {
var usrs_id: Int?;
var usrs_nombre: String?;
var usrs_numero_asoiciado : Int?;
var usrs_telefono : Int?;
var usrs_sexo : Int?;
var usrs_password: String?;
var usrs_usuario: String?;
var usrs_correo: String?;
var usrs_activation: String?;
var usrs_status: Int?;
var usrs_status_active: Int?;
var usrs_plantel: Int?;
var usrs_psts_id: Int?;
var usrs_imss: String?;
var usrs_fecha_ingreso: String?;
var usrs_plantel_residencia: Int?;
var usrs_foja: String?;
var usrs_tomo: String?;
var usrs_licencia: String?;
var usrs_direccion: String?;
var usrs_reincorporacion: String?;
var usrs_stsu_id: Int?;
var usrs_tpsg_id: Int?;
var usrs_curp: String?;
var usrs_enc_password: String?;
}
это класс и функция для получения данных из моего веб-сервиса, имя функции — downloadData:
import Foundation
import SwiftUI
class WebService {
func downloadData(_ dynamicType: T.Type,fromURL: String) async -> GenericResponse? {
do {
var urlComponents = URLComponents(string: fromURL)!
let queryItems = [URLQueryItem(name: "actividad", value: "AppLoginCode"),
URLQueryItem(name: "data", value: "{\"email\":\"1\",\"password\":\"pass_123\"}")]
urlComponents.queryItems = queryItems
let url = urlComponents.url!
//guard let url = URL(string: fromURL)?.appending(queryItems: queryItems) else { throw NetworkError.badUrl }
let (data, response) = try await URLSession.shared.data(from: url)
guard let response = response as? HTTPURLResponse else { throw NetworkError.badResponse }
guard response.statusCode >= 200 && response.statusCode < 300 else { throw NetworkError.badStatus }
if let base64Decoded = Data(base64Encoded: data.base64EncodedString(), options: Data.Base64DecodingOptions(rawValue: 0))
.map({ String(data: $0, encoding: .utf8) }) {
// Convert back to a string
print("Decoded: \(base64Decoded ?? "")")
}
guard let decodedResponse = try? JSONDecoder().decode(GenericResponse.self, from: data) else { throw NetworkError.failedToDecodeResponse }
return decodedResponse
} catch NetworkError.badUrl {
print("There was an error creating the URL")
} catch NetworkError.badResponse {
print("Did not get a valid response")
} catch NetworkError.badStatus {
print("Did not get a 2xx status code from the response")
} catch NetworkError.failedToDecodeResponse {
print("Failed to decode response into the given type")
} catch {
print("An error occured downloading the data")
}
return nil
}
}
это мой Observable для вызова downloadData:
class PostViewModel: ObservableObject {
@Published var postData: GenericResponse = GenericResponse()
func fetchData() async {
guard let downloadedPosts: GenericResponse = await WebService().downloadData(JwtResponse.self,fromURL: "https://***********************.com/BackEnd/WsBackEnd.php") else {return}
postData = downloadedPosts
}
}
комментируя, я расшифровал ответ веб-сервиса и затем получил правильный Json, который я ожидал:
{
"response":"OK",
"message":null,
"data":{
"jwtEncode":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MjI3MjY5MzMsImlzcyI6ImxvY2FsaG9zdCIsIm5iZiI6MTcyMjcyNjkzMywiZXhwIjoxNzI1MzE4OTMzLCJlbWFpbCI6ImVkZXI0MTRjQGdtYWlsLmNvbSIsInVzZXJuYW1lIjoiZWFwMDMxIn0.qu_F2zQceWsMT0pDCugOo__aD8SE5bRZRsbS5haflP8",
"jwtDecode":{
"iat":1722726933,
"iss":"localhost",
"nbf":1722726933,
"exp":1725318933,
"email":"eder414c@gmail.com",
"username":"eap031"
},
"usuario":{
"usrs_id":"1",
"usrs_nombre":"Eder Alexis",
"usrs_numero_asoiciado":"1",
"usrs_telefono":"2147483647",
"usrs_sexo":"1",
"usrs_usuario":"eap031",
"usrs_correo":"eder414c@gmail.com",
"usrs_plantel":"6"
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... eric-types
Ошибка JSONDecoder Swift – использование универсальных типов [закрыто] ⇐ IOS
Программируем под IOS
1722735236
Anonymous
Я хочу быстро преобразовать строку json в объект с универсальным типом. технически у меня есть класс [b]GenricResponse[/b], и этот класс имеет свойство Generic, в этом свойстве это будет класс JsonWebToken (JwtResponse). [b]JwtResponse[/b] имеет еще два класса ([b]JwtDecode[/b] и [b]Usuarios[/b]). когда программа пытается преобразовать данные в объект, я получаю сообщение об ошибке преобразования: [b]Не удалось декодировать ответ в заданный тип[/b]
насколько я понимаю json соответствует структуре объекта: [b]GenericResponse[/b]
это мой класс GenericResponse
import Foundation
import SwiftUI
class GenericResponse: Codable {
var message: String?;
var response: String?;
var data: T?;
}
Класс JwtResponse:
import Foundation
import Swift
struct JwtResponse: Codable {
var jwtEncode: String;
var jwtDecode: JwtDecode;
var usuario: Usuarios;
}
Класс JwtDecode:
import Foundation
import SwiftUI
class JwtDecode : Codable {
var iat: Int;
var iss: String;
var nbf: Int;
var exp: Int;
var email: String;
var username: String;
}
класс Усуариос:
import Foundation
import Swift
class Usuarios: Codable {
var usrs_id: Int?;
var usrs_nombre: String?;
var usrs_numero_asoiciado : Int?;
var usrs_telefono : Int?;
var usrs_sexo : Int?;
var usrs_password: String?;
var usrs_usuario: String?;
var usrs_correo: String?;
var usrs_activation: String?;
var usrs_status: Int?;
var usrs_status_active: Int?;
var usrs_plantel: Int?;
var usrs_psts_id: Int?;
var usrs_imss: String?;
var usrs_fecha_ingreso: String?;
var usrs_plantel_residencia: Int?;
var usrs_foja: String?;
var usrs_tomo: String?;
var usrs_licencia: String?;
var usrs_direccion: String?;
var usrs_reincorporacion: String?;
var usrs_stsu_id: Int?;
var usrs_tpsg_id: Int?;
var usrs_curp: String?;
var usrs_enc_password: String?;
}
это класс и функция для получения данных из моего веб-сервиса, имя функции — downloadData:
import Foundation
import SwiftUI
class WebService {
func downloadData(_ dynamicType: T.Type,fromURL: String) async -> GenericResponse? {
do {
var urlComponents = URLComponents(string: fromURL)!
let queryItems = [URLQueryItem(name: "actividad", value: "AppLoginCode"),
URLQueryItem(name: "data", value: "{\"email\":\"1\",\"password\":\"pass_123\"}")]
urlComponents.queryItems = queryItems
let url = urlComponents.url!
//guard let url = URL(string: fromURL)?.appending(queryItems: queryItems) else { throw NetworkError.badUrl }
let (data, response) = try await URLSession.shared.data(from: url)
guard let response = response as? HTTPURLResponse else { throw NetworkError.badResponse }
guard response.statusCode >= 200 && response.statusCode < 300 else { throw NetworkError.badStatus }
if let base64Decoded = Data(base64Encoded: data.base64EncodedString(), options: Data.Base64DecodingOptions(rawValue: 0))
.map({ String(data: $0, encoding: .utf8) }) {
// Convert back to a string
print("Decoded: \(base64Decoded ?? "")")
}
guard let decodedResponse = try? JSONDecoder().decode(GenericResponse.self, from: data) else { throw NetworkError.failedToDecodeResponse }
return decodedResponse
} catch NetworkError.badUrl {
print("There was an error creating the URL")
} catch NetworkError.badResponse {
print("Did not get a valid response")
} catch NetworkError.badStatus {
print("Did not get a 2xx status code from the response")
} catch NetworkError.failedToDecodeResponse {
print("Failed to decode response into the given type")
} catch {
print("An error occured downloading the data")
}
return nil
}
}
это мой Observable для вызова downloadData:
class PostViewModel: ObservableObject {
@Published var postData: GenericResponse = GenericResponse()
func fetchData() async {
guard let downloadedPosts: GenericResponse = await WebService().downloadData(JwtResponse.self,fromURL: "https://***********************.com/BackEnd/WsBackEnd.php") else {return}
postData = downloadedPosts
}
}
комментируя, я расшифровал ответ веб-сервиса и затем получил правильный Json, который я ожидал:
{
"response":"OK",
"message":null,
"data":{
"jwtEncode":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MjI3MjY5MzMsImlzcyI6ImxvY2FsaG9zdCIsIm5iZiI6MTcyMjcyNjkzMywiZXhwIjoxNzI1MzE4OTMzLCJlbWFpbCI6ImVkZXI0MTRjQGdtYWlsLmNvbSIsInVzZXJuYW1lIjoiZWFwMDMxIn0.qu_F2zQceWsMT0pDCugOo__aD8SE5bRZRsbS5haflP8",
"jwtDecode":{
"iat":1722726933,
"iss":"localhost",
"nbf":1722726933,
"exp":1725318933,
"email":"eder414c@gmail.com",
"username":"eap031"
},
"usuario":{
"usrs_id":"1",
"usrs_nombre":"Eder Alexis",
"usrs_numero_asoiciado":"1",
"usrs_telefono":"2147483647",
"usrs_sexo":"1",
"usrs_usuario":"eap031",
"usrs_correo":"eder414c@gmail.com",
"usrs_plantel":"6"
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78830093/jsondecoder-swift-error-using-generic-types[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия