Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将JSON数据转换为模型_Ios_Json_Swift_Swift5 - Fatal编程技术网

Ios 如何将JSON数据转换为模型

Ios 如何将JSON数据转换为模型,ios,json,swift,swift5,Ios,Json,Swift,Swift5,我有restcountries.eu ulr,我需要将其转换为模型格式,但我遇到了一个错误 错误:无法读取数据,因为它的格式不正确 这是我的JSON { "name": "Afghanistan", "topLevelDomain": [ ".af" ], "alpha2Code": "AF", "alpha3Code": "AFG", "callingCodes": [ "93" ], "capital": "Kabul", "altSpel

我有restcountries.eu ulr,我需要将其转换为模型格式,但我遇到了一个错误

错误:无法读取数据,因为它的格式不正确

这是我的JSON

{
  "name": "Afghanistan",
  "topLevelDomain": [
    ".af"
  ],
  "alpha2Code": "AF",
  "alpha3Code": "AFG",
  "callingCodes": [
    "93"
  ],
  "capital": "Kabul",
  "altSpellings": [
    "AF",
    "Afġānistān"
  ],
  "region": "Asia",
  "subregion": "Southern Asia",
  "population": 27657145,
  "latlng": [
    33,
    65
  ],
  "demonym": "Afghan",
  "area": 652230,
  "gini": 27.8,
  "timezones": [
    "UTC+04:30"
  ],
  "borders": [
    "IRN",
    "PAK",
    "TKM",
    "UZB",
    "TJK",
    "CHN"
  ],
  "nativeName": "افغانستان",
  "numericCode": "004",
  "currencies": [
    {
      "code": "AFN",
      "name": "Afghan afghani",
      "symbol": "؋"
    }
  ],
  "languages": [
    {
      "iso639_1": "ps",
      "iso639_2": "pus",
      "name": "Pashto",
      "nativeName": "پښتو"
    },
    {
      "iso639_1": "uz",
      "iso639_2": "uzb",
      "name": "Uzbek",
      "nativeName": "Oʻzbek"
    },
    {
      "iso639_1": "tk",
      "iso639_2": "tuk",
      "name": "Turkmen",
      "nativeName": "Türkmen"
    }
  ],
  "translations": {
    "de": "Afghanistan",
    "es": "Afganistán",
    "fr": "Afghanistan",
    "ja": "アフガニスタン",
    "it": "Afghanistan",
    "br": "Afeganistão",
    "pt": "Afeganistão",
    "nl": "Afghanistan",
    "hr": "Afganistan",
    "fa": "افغانستان"
  },
  "flag": "https://restcountries.eu/data/afg.svg",
  "regionalBlocs": [
    {
      "acronym": "SAARC",
      "name": "South Asian Association for Regional Cooperation",
      "otherAcronyms": [],
      "otherNames": []
    }
  ],
  "cioc": "AFG"
}
我为上述JSON创建了模型

创建模型

class Country: Codable {
    var name: String?
    var topLevelDomain: [String]?
    var alpha2Code: String?
    var alpha3Code: String?
    var callingCodes: [String]?
    var capital: String?
    var altSpellings: [String]?
    var region: String?
    var subregion: String?
    var population: CLong?
    var latlng: [Double]?
    var demonym: String?
    var area: CLong?
    var gini: Double?
    var timezones: [String]?
    var borders: [String]?
    var nativeName: String?
    var numericCode: String?
    var currencies: [Currencie]?
    var languages: [Language]?
    var translations: Translation?
    var flag: String?
    var regionalBlocs: [RegionalBloc]?
    var cioc: String?
}
第二个模型作为子模型

class Currencie: Codable {
    var code: String?
    var name: String?
    var symbol: String?
}

class Language: Codable {
    var iso639_1: String?
    var iso639_2: String?
    var name: String?
    var nativeName: String?
}
第三个模型作为子模型

class Translation: Codable {
    var de: String?
    var es: String?
    var fr: String?
    var ja: String?
    var it: String?
    var br: String?
    var pt: String?
    var nl: String?
    var hr: String?
    var fa: String?
}
第四模型作为子模型

class RegionalBloc: Codable {
    var acronym: String?
    var name: String?
    var otherAcronyms: [String?]?
    var otherNames: [String?]?
}
当我把它从数据解码到下面的模型中

decoder.decode([Country].self, from: data)

获取错误:错误:无法读取数据,因为它的格式不正确。

根据您的JSON,只有一个Country对象存在

当json具有多个国家/地区对象时,它将起作用

do {
    let decoder = JSONDecoder()
    let country = try decoder.decode([Country].self, from: jsonData)
    print(country)
}
catch {
    print(error)
}
根据当前的JSON:

解决方案
:代替
[Country].self
使用
Country.self

do {
    let decoder = JSONDecoder()
    let country = try decoder.decode(Country.self, from: jsonData)
    print(country)
}
catch {
    print(error)
}

使用以下模型来解码JSON 准备模型的来源是


不要打印
错误。本地化描述
,始终打印
错误
。它会告诉你到底出了什么问题。乍一看,根对象不是数组。
do {
    let decoder = JSONDecoder()
    let country = try decoder.decode(Country.self, from: jsonData)
    print(country)
}
catch {
    print(error)
}



// MARK: - Country
struct Country: Codable {
    let name: String
    let topLevelDomain: [String]
    let alpha2Code, alpha3Code: String
    let callingCodes: [String]
    let capital: String
    let altSpellings: [String]
    let region, subregion: String
    let population: Int
    let latlng: [Int]
    let demonym: String
    let area: Int
    let gini: Double
    let timezones, borders: [String]
    let nativeName, numericCode: String
    let currencies: [Currency]
    let languages: [Language]
    let translations: Translations
    let flag: String
    let regionalBlocs: [RegionalBloc]
    let cioc: String
}

// MARK: - Currency
struct Currency: Codable {
    let code, name, symbol: String
}

// MARK: - Language
struct Language: Codable {
    let iso6391, iso6392, name, nativeName: String

    enum CodingKeys: String, CodingKey {
        case iso6391 = "iso639_1"
        case iso6392 = "iso639_2"
        case name, nativeName
    }
}

// MARK: - RegionalBloc
struct RegionalBloc: Codable {
    let acronym, name: String
    let otherAcronyms, otherNames: [JSONAny]
}

// MARK: - Translations
struct Translations: Codable {
    let de, es, fr, ja: String
    let it, br, pt, nl: String
    let hr, fa: String
}