Comment faire des appels de l'API à l'aide struct avec le numéro dans le fichier json

0

La question

Offrant plus de détails:

Je suis en train d'essayer d'accéder à un niveau à partir d'une API (lien ci-dessous), qui a une structure, un chiffre au début de l'un des niveaux (25th_percentile). Je suis incapable de créer une constante dans mon modèle, car je ne peux pas lancer la valeur avec un certain nombre (ie, 25 en 25th_percentile). Comment pouvez-vous accéder aux données à la 25e centile de niveau?

Mon code est comme suit. Lorsque j'utilise enum comme suggéré, j'obtiens un "non-conforme à décodable protocole d'erreur".

     //
 //  SchoolData.swift
 //
 //

 import Foundation

 struct Results: Decodable {
     let results: [SelectedSchool]
 }



 struct SelectedSchool: Decodable, Identifiable {
     let id: Int
     let fed_sch_cd: String
     let latest: LatestData

 }
 struct LatestData: Decodable {
     let school: SchoolDetails
     let admissions: AdmissionsDetails
 }

 struct SchoolDetails: Decodable {
     let name: String
     let school_url: String
 }

 struct AdmissionsDetails: Decodable {
     let admission_rate: AdmissionRateDetails
     let sat_scores: SATScores
 }


 struct SATScores: Decodable {
     let midpoint: SATSubjects
     let the25th_percentile: SATSubjects2

     enum CodingKeys: String, CodingKey {
         case the25th_percentile = "25th_percentile"
     }
 }




 struct SATSubjects: Decodable {
     let math: Int?
     let writing: Int?
     let critical_reading: Int?
 }


 struct SATSubjects2: Decodable {
     let math: Int?
     let writing: Int?
     let critical_reading: Int?
 }


 struct AdmissionRateDetails: Decodable {
     let overall: Float?
 }

 struct URLName {
     let partialURL = "https://api.data.gov/ed/collegescorecard/v1/schools?school.name="
     var searchTerm: String = ""
     let apiKey = "&api_key=myapikey"
 }

L'API converti en JSON.

api json swiftui
2021-11-23 03:43:03
1

La meilleure réponse

0

essayez ceci:

struct SATTwentyFive: Decodable {
    let the25th_percentile: SubjectData
    
    enum CodingKeys: String, CodingKey {
        case the25th_percentile = "25th_percentile"
    }
}

EDIT1:

Essayez ce genre de structures pour lire vos données json (qui fonctionne bien pour moi):

struct Results: Decodable {
    let results: [SelectedSchool]
}

struct SelectedSchool: Decodable, Identifiable {
    let id: Int
    let fed_sch_cd: String
    let latest: LatestData
}

struct LatestData: Decodable {
    let school: SchoolDetails
    let admissions: AdmissionsDetails
}

struct SchoolDetails: Decodable {
    let name: String
    let school_url: String
}

struct AdmissionsDetails: Decodable {
    let admission_rate: AdmissionRateDetails
    let sat_scores: SATScores
}

// ---- here ----
struct SATScores: Decodable {
    let midpoint: SATSubjects
    let the25th_percentile: SATSubjects

    enum CodingKeys: String, CodingKey {
        case the25th_percentile = "25th_percentile"
        case midpoint = "midpoint"
    }
}

struct SATSubjects: Decodable {
    let math: Int?
    let writing: Int?
    let critical_reading: Int?
}

struct AdmissionRateDetails: Decodable {
    let overall: Float?
}

et de décoder les Results comme:

try JSONDecoder().decode(Results.self, from: data)
2021-11-25 03:09:56

grâce workingdog - quand je le fais, comme l'a suggéré, je reçois un qui n'est pas conforme à décodable erreur de protocole.
boxscorepress.com

L'approche dans ma réponse à la enum CodingKeys des œuvres. J'ai mis à jour ma réponse. P. S: ne postez pas votre clé secrète, retirez-la.
workingdog

workingdog - suppression de la clé API et MERCI!!!!!!! J'ai essayé 1000 choses, mais apparemment pas la-dessus. vraiment apprécie vraiment votre temps!!!
boxscorepress.com

content que ça fonctionne. Si ma réponse a été en usage, pourrait le marquer comme correct s'il vous plaît.
workingdog

Je n'ai marquer mais je n'ai pas assez de “points de réputation” pour qu'il accepte ma marque. Il dit qu'il a noté en quelque sorte. Je vous remercie encore.
boxscorepress.com

oh, je ne savais pas que vous ne peut pas accepter une réponse lorsque vous postez une question. Merci quand même.
workingdog

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................