Создание массива JSON с помощью Swift 4.2 - PullRequest
0 голосов
/ 10 июня 2019

Я не могу получить данные json с URL

Я пробовал Alamofire, Swiftyjson и JSONDecoder, но я не получил никаких данных

Это мой результат json url;

{
  "Firmalar": {
    "Firma": [
      {
        "SicilNo": "382",
        "FirmaAdi": "AYSAN PAMUK YAĞ VE YEM SANAYİ TİCARET ANONİM ŞİRKETİ",
        "Sektor": "GIDA ÜRÜNLERİ İMALATI ",
        "AcikAdres": "ACIDEREOSB MAHALLESİ FUZULİ CADDESİ NO: 2 ",
        "TelefonNo": "(322)394-5029",
        "FaksNo": "(322)394-4929",
        "EPosta": "mahmutkulak.aysanas@gmail.com",
        "WebAdresi": "www.aysanpamuk.com",
        "WebDurumu": "1",
        "TanitimFilmTR": "",
        "TanitimFilmEN": "",
        "TanitimBrosurTR": "",
        "TanitimBrosurEN": ""
      },      {
        "SicilNo": "1127",
        "FirmaAdi": "EKOVAR GERİ DÖNÜŞÜM MAKİNA İNŞAAT SAN. VE TİC. LTD. ŞTİ.",
        "Sektor": "DİĞER İMALATLAR",
        "AcikAdres": "ACIDEREOSB MAHALLESİ CUMHURİYET BULVARI NO: 26 ",
        "TelefonNo": "(312)442-1305",
        "FaksNo": "(312)442-1306",
        "EPosta": "mesut@ekovar.com.tr",
        "WebAdresi": "www.ekovar.com.tr",
        "WebDurumu": "1",
        "TanitimFilmTR": "",
        "TanitimFilmEN": "",
        "TanitimBrosurTR": "",
        "TanitimBrosurEN": ""
      }
    ]
  }
}

Это моя структура;

struct Firmalar: Codable {
    let Firma: [FirmaModel]?
}

struct FirmaModel: Codable{
    let SicilNo:String?
    let FirmaAdi:String?
    let Sektor:String?
    let AcikAdres:String?
    let TelefonNo:String?
    let FaksNo:String?
    let EPosta:String?
    let WebAdresi:String?
    let TanitimFilmTR:String?
    let TanitimBrosurTR:String?

    enum CodingKeys: String, CodingKey {
        case SicilNo="SicilNo", FirmaAdi="FirmaAdi", Sektor="Sektor", AcikAdres="AcikAdres", TelefonNo="TelefonNo", FaksNo="FaksNo", EPosta="EPosta", WebAdresi="WebAdresi", TanitimFilmTR="TanitimFilmTR", TanitimBrosurTR="TanitimBrosurTR"
    }
}

Это мой код fetchData;

 var firmalar = [Firmalar]()
    let searchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchFirmaData()
    }

    func fetchFirmaData(){
        let url = URL(string: "http://mobileapi.adanaorganize.org.tr/v1/firmalar")
        guard let downloadURL = url else {return}
        URLSession.shared.dataTask(with: downloadURL) { (data, response, error) in
            do{
                if error == nil {
                    self.firmalar = try JSONDecoder().decode([Firmalar].self, from: data!)
                    DispatchQueue.main.async {
                        print(self.firmalar)
                        self.tableView.reloadData()
                    }
                }
            } catch {
                print("Error While Geting Json Data: " + error.localizedDescription)
            }
            }.resume()
    }

, поэтому мой вопрос, как я могу создать массив.используя swift.вот мой быстрый кодЯ получаю эту ошибку: данные не могут быть прочитаны, потому что они не в правильном формате.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

У вас нет массива Firmalar, но есть одно значение, и оно само должно быть частью отдельной структуры корневого уровня, поэтому измените

self.firmalar = try JSONDecoder().decode([Firmalar].self, from: data!)

на

let result = try JSONDecoder().decode(Response.self, from: data!)
self.firmalar = result.Firmalar.Firma

и, конечно, вам нужно изменить объявление firmalar на

var firmalar = [FirmaModel]()

и включить структуру корневого уровня

struct Response: Decodable {
    let Firmalar: Firmalar
}
0 голосов
/ 10 июня 2019

Прежде всего никогда print error.localizedDescription, он возвращает общее совершенно бессмысленное сообщение об ошибке. Печатать всегда просто error.

Настоящая ошибка

Ожидается декодирование массива, но вместо этого найден словарь

Ошибка довольно очевидна. Посмотрите на JSON. Корневой объект - это словарь, значение ключа Firma - это массив, который вы ищете.

Вы должны добавить еще одну структуру для корневого объекта и декодировать это

struct Root: Codable {
    let firmalar: Firmalar

    private enum CodingKeys: String, CodingKey { case firmalar = "Firmalar" }
}

struct Firmalar: Codable {
    let firma: [FirmaModel]

    private enum CodingKeys: String, CodingKey { case firma = "Firma" }
}

struct FirmaModel: Codable { ...

Объявление массива источника данных

var firmaModel = [FirmaModel]()

и декодировать JSON

if error == nil {
    let result = try JSONDecoder().decode(Root.self, from: data!)
    self.firmaModel = result.firmalar.firma

Объявите все элементы структуры как необязательные, а элементы в нижнем регистре сопоставляются с CodingKeys, как в моих предложенных структурах.

...