Ошибка JSONDecoder Swift – использование универсальных типов [закрыто]IOS

Программируем под IOS
Ответить
Anonymous
 Ошибка JSONDecoder Swift – использование универсальных типов [закрыто]

Сообщение Anonymous »

Я хочу быстро преобразовать строку 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»