Как сделать вызов API, используя структуру с номером в файле json

0

Вопрос

Предоставление более подробной информации:

Я пытаюсь получить доступ к уровню из API (по ссылке ниже), в структуре которого есть число в начале одного из уровней (25-й центиль). Я не могу создать константу в своей модели, потому что я не могу начать значение let с числа (т. Е. 25 в 25th_percentile). Как вы можете получить доступ к данным на уровне 25-го процентиля?

Мой код выглядит следующим образом. Когда я использую перечисление, как было предложено, я получаю ошибку "не соответствует декодируемому протоколу".

     //
 //  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"
 }

API преобразуется в JSON.

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

Лучший ответ

0

попробуй это:

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

ПРАВКА1:

Попробуйте использовать такие структуры для чтения ваших данных json (для меня это хорошо работает).:

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?
}

и расшифровать Results Нравится:

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

спасибо workingdog - когда я делаю, как предложено, я получаю ошибку, не соответствующую декодируемому протоколу.
boxscorepress.com

Подход в моем ответе с enum CodingKeys работает. Я обновил свой ответ. P. S: не публикуйте свой секретный ключ, удалите его сейчас.
workingdog

workingdog - удалил API-ключ и СПАСИБО ВАМ!!!! Я перепробовал 1000 вещей, но, по-видимому, не вышеперечисленное. очень, очень ценю ваше время!!!
boxscorepress.com

рад, что это работает. Если мой ответ был полезен, пожалуйста, отметьте его как правильный.
workingdog

Я пометил его, но у меня недостаточно “очков репутации”, чтобы он принял мою метку. Он сказал, что каким-то образом это заметил. Еще раз спасибо вам.
boxscorepress.com

о, я не знал, что вы не можете принять ответ, когда задаете вопрос. В любом случае, спасибо.
workingdog

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................