Lettura in un file JSON utilizzando Swift


206

Sono davvero alle prese con il tentativo di leggere un file JSON in Swift in modo da poterlo giocare. Ho trascorso la maggior parte dei 2 giorni a cercare e provare diversi metodi, ma non ho ancora avuto fortuna, quindi mi sono iscritto a StackOverFlow per vedere se qualcuno può indicarmi la giusta direzione .....

Il mio file JSON si chiama test.json e contiene quanto segue:

{
  "person":[
     {
       "name": "Bob",
       "age": "16",
       "employed": "No"
     },
     {
       "name": "Vinny",
       "age": "56",
       "employed": "Yes"
     }
  ]
}    

Il file viene archiviato direttamente nei documenti e accedo tramite il seguente codice:

let file = "test.json"
let dirs : String[] = NSSearchPathForDirectoriesInDomains(
                                                          NSSearchpathDirectory.DocumentDirectory,
                                                          NSSearchPathDomainMask.AllDomainMask,
                                                          true) as String[]

if (dirs != nil) {
    let directories: String[] = dirs
    let dir = directories[0]
    let path = dir.stringByAppendingPathComponent(file)
}

var jsonData = NSData(contentsOfFile:path, options: nil, error: nil)
println("jsonData \(jsonData)" // This prints what looks to be JSON encoded data.

var jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as? NSDictionary

println("jsonDict \(jsonDict)") - This prints nil..... 

Se qualcuno mi può dare una spinta nella giusta direzione su come posso serializzare il file JSON e metterlo in un oggetto Swift accessibile, sarò eternamente grato!

Cordiali saluti,

Krivvenz.


1
usa il parametro di errore ...
Matthias Bauch il

2
Si prega di inserire il codice effettivo compilabile. Come è ora, pathè visibile solo ifnell'ambito e non risolto quando lo si utilizza NSData(contentsOfFile, options, error); hai anche errori di battitura nei nomi enum.
Kreiri,

1
La mia API è completamente aggiornata per Swift 3: github.com/borchero/WebParsing
borchero

questa è la chiave -> "valori": "% CARICARE IL VALORE DAL file tmclass.json%" e devo analizzare un altro JSON dal file, quindi come posso farlo in SWIFT?
Mayur Shinde,

Risposte:


288

Segui il codice qui sotto:

if let path = NSBundle.mainBundle().pathForResource("test", ofType: "json")
{
    if let jsonData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)
    {
        if let jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
        {
            if let persons : NSArray = jsonResult["person"] as? NSArray
            {
                // Do stuff
            }
        }
     }
}

L'array "persone" conterrà tutti i dati per la persona chiave. Scorrere i passaggi per recuperarlo.

Swift 4.0:

if let path = Bundle.main.path(forResource: "test", ofType: "json") {
    do {
          let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
          let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
          if let jsonResult = jsonResult as? Dictionary<String, AnyObject>, let person = jsonResult["person"] as? [Any] {
                    // do stuff
          }
      } catch {
           // handle error
      }
}

4
Sarebbe più utile se spiegassi perché / come questo risolve il problema descritto nella domanda, invece di presentare solo un mucchio di codice.
Martin R,

Ciao Abhishek - Grazie per la risposta, ma continua a non funzionare. Ciò causa l'arresto anomalo dell'applicazione con l'errore seguente: 25/06/2014 16: 02: 04.146 H&S Capture [4937: 131932] *** Terminazione dell'app a causa dell'eccezione non rilevata "NSInvalidArgumentException", motivo: "*** - [_NSPlaceholderData initWithContentsOfFile: opzioni: errore:]: argomento del file nullo '*** Stack di chiamate del primo lancio: Qualche idea sul perché? Per le opzioni jsonData: ho inserito (percorso, opzioni: NSDataReadingOptions.DataReadingMappedIfSafe, errore: zero)
Krivvenz

Il percorso del file non è corretto. In realtà, non esiste alcun file denominato test.json nel percorso specificato dall'utente. Verifica la posizione corretta del file
Abhishek,

15
"let jsonData = NSData (contentsOfFile: path!)" invece di "let jsonData = NSData.dataWithContentsOfFile (path, options: .DataReadingMappedIfSafe, error: nil)"
tong

7
È meglio usare qui le dichiarazioni degli altri guardiani invece di questa piramide del destino.
Zonily Jame,

140

Se qualcuno sta cercando SwiftyJSON Risposta:
Aggiornamento:
Per Swift 3/4:

if let path = Bundle.main.path(forResource: "assets/test", ofType: "json") {
    do {
        let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
        let jsonObj = try JSON(data: data)
        print("jsonData:\(jsonObj)")
    } catch let error {
        print("parse error: \(error.localizedDescription)")
    }
} else {
    print("Invalid filename/path.")
}

2
questo mi ha trasformato in swiftyJSON e carthage! grazie :)
Paul Wand,

l'ho usato solo per scoprire che manca la mappatura degli oggetti, la prossima volta proverò una libreria diversa
Elazaron

Per evitare errori di copia incolla in swift 3: NSData e NSError sono diventati Data ed Errore.
selva,

Ho provato alcuni metodi diversi e questo ha funzionato al meglio per me in Swift 3
crobicha,

(!) Dal momento che MacOS 10.6 / iOS 4 v'è un'API url(forResourcein (NS)Bundleper evitare il passaggio aggiuntivo per creare l'URL
Vadian

102

Swift 4 usando Decodable

struct ResponseData: Decodable {
    var person: [Person]
}
struct Person : Decodable {
    var name: String
    var age: String
    var employed: String
}

func loadJson(filename fileName: String) -> [Person]? {
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            let jsonData = try decoder.decode(ResponseData.self, from: data)
            return jsonData.person
        } catch {
            print("error:\(error)")
        }
    }
    return nil
}

Swift 3

func loadJson(filename fileName: String) -> [String: AnyObject]? {
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let object = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
            if let dictionary = object as? [String: AnyObject] {
                return dictionary
            }
        } catch {
            print("Error!! Unable to parse  \(fileName).json")
        }
    }
    return nil
}

9
Questo dovrebbe essere spostato nella nuova funzione di documentazione o contrassegnato come risposta corretta.
sistema

24

Xcode 8 Swift 3 legge json dall'aggiornamento del file:

    if let path = Bundle.main.path(forResource: "userDatabseFakeData", ofType: "json") {
        do {
            let jsonData = try NSData(contentsOfFile: path, options: NSData.ReadingOptions.mappedIfSafe)
            do {
                let jsonResult: NSDictionary = try JSONSerialization.jsonObject(with: jsonData as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
                if let people : [NSDictionary] = jsonResult["person"] as? [NSDictionary] {
                    for person: NSDictionary in people {
                        for (name,value) in person {
                            print("\(name) , \(value)")
                        }
                    }
                }
            } catch {}
        } catch {}
    }

14

Nomi aggiornati per Swift 3.0

Basato sulla risposta di Abhishek e sulla risposta di Druva

func loadJson(forFilename fileName: String) -> NSDictionary? {

    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        if let data = NSData(contentsOf: url) {
            do {
                let dictionary = try JSONSerialization.jsonObject(with: data as Data, options: .allowFragments) as? NSDictionary

                return dictionary
            } catch {
                print("Error!! Unable to parse  \(fileName).json")
            }
        }
        print("Error!! Unable to load  \(fileName).json")
    }

    return nil
}

12

Semplificazione dell'esempio fornito da Peter Kreinz. Funziona con Swift 4.2.

La funzione di estensione:

extension Decodable {
  static func parse(jsonFile: String) -> Self? {
    guard let url = Bundle.main.url(forResource: jsonFile, withExtension: "json"),
          let data = try? Data(contentsOf: url),
          let output = try? JSONDecoder().decode(self, from: data)
        else {
      return nil
    }

    return output
  }
}

Il modello di esempio:

struct Service: Decodable {
  let name: String
}

L'esempio di utilizzo:

/// service.json
/// { "name": "Home & Garden" }

guard let output = Service.parse(jsonFile: "service") else {
// do something if parsing failed
 return
}

// use output if all good

L'esempio funzionerà anche con le matrici:

/// services.json
/// [ { "name": "Home & Garden" } ]

guard let output = [Service].parse(jsonFile: "services") else {
// do something if parsing failed
 return
}

// use output if all good

Nota come non forniamo generici non necessari, quindi non abbiamo bisogno di esprimere il risultato dell'analisi.


10

Risposta Swift 2.1 (basata su Abhishek's):

    if let path = NSBundle.mainBundle().pathForResource("test", ofType: "json") {
        do {
            let jsonData = try NSData(contentsOfFile: path, options: NSDataReadingOptions.DataReadingMappedIfSafe)
            do {
                let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
                if let people : [NSDictionary] = jsonResult["person"] as? [NSDictionary] {
                    for person: NSDictionary in people {
                        for (name,value) in person {
                            print("\(name) , \(value)")
                        }
                    }
                }
            } catch {}
        } catch {}
    }

10

Swift 3.0, Xcode 8, iOS 10

 if let path = Bundle.main.url(forResource: "person", withExtension: "json") {

        do {
            let jsonData = try Data(contentsOf: path, options: .mappedIfSafe)
            do {
                if let jsonResult = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions(rawValue: 0)) as? NSDictionary {
                    if let personArray = jsonResult.value(forKey: "person") as? NSArray {
                        for (_, element) in personArray.enumerated() {
                            if let element = element as? NSDictionary {
                                let name = element.value(forKey: "name") as! String
                                let age = element.value(forKey: "age") as! String
                                let employed = element.value(forKey: "employed") as! String
                                print("Name: \(name),  age: \(age), employed: \(employed)")
                            }
                        }
                    }
                }
            } catch let error as NSError {
                print("Error: \(error)")
            }
        } catch let error as NSError {
            print("Error: \(error)")
        }
    }

Produzione:

Name: Bob,  age: 16, employed: No
Name: Vinny,  age: 56, employed: Yes

7

Questo ha funzionato alla grande con me

func readjson(fileName: String) -> NSData{

    let path = NSBundle.mainBundle().pathForResource(fileName, ofType: "json")
    let jsonData = NSData(contentsOfMappedFile: path!)

    return jsonData!
}

7

Ecco la mia soluzione usando SwiftyJSON

if let path : String = NSBundle.mainBundle().pathForResource("filename", ofType: "json") {
    if let data = NSData(contentsOfFile: path) {

        let json = JSON(data: data)

    }
}

7
fileprivate class BundleTargetingClass {}
func loadJSON<T>(name: String) -> T? {
  guard let filePath = Bundle(for: BundleTargetingClass.self).url(forResource: name, withExtension: "json") else {
    return nil
  }

  guard let jsonData = try? Data(contentsOf: filePath, options: .mappedIfSafe) else {
    return nil
  }

  guard let json = try? JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) else {
    return nil
  }

  return json as? T
}

👆🏻 soluzione copia-incolla, indipendente da framework di terze parti.

utilizzo 👇🏻

let json:[[String : AnyObject]] = loadJSON(name: "Stations")!


questo ha funzionato per me. Avevo bisogno di codificare un elenco di farmaci ricercabili in un'app. Ho ottenuto il file JSON dal database mySQL. Ho lasciato cadere il file json nel mio progetto XCODE in esecuzione sopra in viewDidLoad e bam avevo il mio dizionario json !!!
Brian,

5

Sto fornendo un'altra risposta perché nessuno qui è orientato al caricamento della risorsa dal pacchetto di test. Se stai utilizzando un servizio remoto che emette JSON e desideri testare l'unità analizzando i risultati senza colpire il servizio effettivo, prendi una o più risposte e inseriscile nei file nella cartella Test del tuo progetto.

func testCanReadTestJSONFile() {
    let path = NSBundle(forClass: ForecastIOAdapterTests.self).pathForResource("ForecastIOSample", ofType: "json")
    if let jsonData = NSData(contentsOfFile:path!) {
        let json = JSON(data: jsonData)
        if let currentTemperature = json["currently"]["temperature"].double {
            println("json: \(json)")
            XCTAssertGreaterThan(currentTemperature, 0)
        }
    }
}

Questo utilizza anche SwiftyJSON ma la logica principale per ottenere il pacchetto di test e caricare il file è la risposta alla domanda.


5

Swift 4: prova la mia soluzione:

test.json

{
    "person":[
        {
            "name": "Bob",
            "age": "16",
            "employed": "No"
        },
        {
            "name": "Vinny",
            "age": "56",
            "employed": "Yes"
        }
    ]
}

RequestCodable.swift

import Foundation

struct RequestCodable:Codable {
    let person:[PersonCodable]
}

PersonCodable.swift

import Foundation

struct PersonCodable:Codable {
    let name:String
    let age:String
    let employed:String
}

Decodificabile + FromJSON.swift

import Foundation

extension Decodable {

    static func fromJSON<T:Decodable>(_ fileName: String, fileExtension: String="json", bundle: Bundle = .main) throws -> T {
        guard let url = bundle.url(forResource: fileName, withExtension: fileExtension) else {
            throw NSError(domain: NSURLErrorDomain, code: NSURLErrorResourceUnavailable)
        }

        let data = try Data(contentsOf: url)

        return try JSONDecoder().decode(T.self, from: data)
    }
}

Esempio:

let result = RequestCodable.fromJSON("test") as RequestCodable?

result?.person.compactMap({ print($0) }) 

/*
PersonCodable(name: "Bob", age: "16", employed: "No")
PersonCodable(name: "Vinny", age: "56", employed: "Yes")
*/

1
Viene fromJSONgenerata la funzione di estensione, ma nell'esempio viene chiamata senza la tryparola chiave. Questo codice non verrà compilato.
NeverwinterMoon,

Inoltre, per fromJSONte usa un'estensione Decodable, ma non usi nessuna informazione del tipo Decodable ma fornisci generici aggiuntivi (completamente inutili).
NeverwinterMoon,

3

L'ultimo swift 3.0 funziona perfettamente

func loadJson(filename fileName: String) -> [String: AnyObject]?
{
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") 
{
      if let data = NSData(contentsOf: url) {
          do {
                    let object = try JSONSerialization.jsonObject(with: data as Data, options: .allowFragments)
                    if let dictionary = object as? [String: AnyObject] {
                        return dictionary
                    }
                } catch {
                    print("Error!! Unable to parse  \(fileName).json")
                }
            }
            print("Error!! Unable to load  \(fileName).json")
        }
        return nil
    }

3

Swift 4 JSONto Classwith Decodable- per chi preferisce le lezioni

Definire le classi come segue:

class People: Decodable {
  var person: [Person]?

  init(fileName : String){
    // url, data and jsonData should not be nil
    guard let url = Bundle.main.url(forResource: fileName, withExtension: "json") else { return }
    guard let data = try? Data(contentsOf: url) else { return }
    guard let jsonData = try? JSONDecoder().decode(People.self, from: data) else { return }

    // assigns the value to [person]
    person = jsonData.person
  }
}

class Person : Decodable {
  var name: String
  var age: String
  var employed: String
}

Utilizzo, piuttosto astratto:

let people = People(fileName: "people")
let personArray = people.person

Ciò consente sia metodi Peopleche Personclassi, variabili (attributi) e metodi possono anche essere contrassegnati come privatenecessari.


3

Il seguente codice funziona per me. Sto usando Swift 5

let path = Bundle.main.path(forResource: "yourJSONfileName", ofType: "json")
var jsonData = try! String(contentsOfFile: path!).data(using: .utf8)!

Quindi, se il tuo Person Struct (o classe) è decodificabile (e anche tutte le sue proprietà), puoi semplicemente fare:

let person = try! JSONDecoder().decode(Person.self, from: jsonData)

Ho evitato tutto il codice di gestione degli errori per renderlo più leggibile.


2

Aggiornato per Swift 3 con il modo più sicuro

    private func readLocalJsonFile() {

    if let urlPath = Bundle.main.url(forResource: "test", withExtension: "json") {

        do {
            let jsonData = try Data(contentsOf: urlPath, options: .mappedIfSafe)

            if let jsonDict = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [String: AnyObject] {

                if let personArray = jsonDict["person"] as? [[String: AnyObject]] {

                    for personDict in personArray {

                        for (key, value) in personDict {

                            print(key, value)
                        }
                        print("\n")
                    }
                }
            }
        }

        catch let jsonError {
            print(jsonError)
        }
    }
}

inserisci qui la descrizione dell'immagine


2

Swift 5.1, Xcode 11

Puoi usare questo:


struct Person : Codable {
    let name: String
    let lastName: String
    let age: Int
}

func loadJson(fileName: String) -> Person? {
   let decoder = JSONDecoder()
   guard
        let url = Bundle.main.url(forResource: fileName, withExtension: "json"),
        let data = try? Data(contentsOf: url),
        let person = try? decoder.decode(Person.self, from: data)
   else {
        return nil
   }

   return person
}

1

Sulla base della risposta di Abhishek , per iOS 8 questo sarebbe:

let masterDataUrl: NSURL = NSBundle.mainBundle().URLForResource("masterdata", withExtension: "json")!
let jsonData: NSData = NSData(contentsOfURL: masterDataUrl)!
let jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as! NSDictionary
var persons : NSArray = jsonResult["person"] as! NSArray

Stai usando Swift 2.0? Quindi sì, sarebbe così. Questa è stata risposta pre-2.0.
David Poxon,

1

Questo ha funzionato per me con XCode 8.3.3

func fetchPersons(){

    if let pathURL = Bundle.main.url(forResource: "Person", withExtension: "json"){

        do {

            let jsonData = try Data(contentsOf: pathURL, options: .mappedIfSafe)

            let jsonResult = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as! [String: Any]
            if let persons = jsonResult["person"] as? [Any]{

                print(persons)
            }

        }catch(let error){
            print (error.localizedDescription)
        }
    }
}

1

Swift 4.1 Xcode aggiornato 9.2

if let filePath = Bundle.main.path(forResource: "fileName", ofType: "json"), let data = NSData(contentsOfFile: filePath) {

     do {
      let json = try JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.allowFragments)        
        }
     catch {
                //Handle error
           }
 }

3
Non c'è nulla di nuovo, al contrario: non usare NSDatain Swift 3+, ed .allowFragmentsè inutile in questo caso.
vadian

1
//change type based on your struct and right JSON file

let quoteData: [DataType] =
    load("file.json")

func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T {
    let data: Data

    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
        else {
            fatalError("Couldn't find \(filename) in main bundle.")
    }

    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
    }

    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
    }
}


0

Ho usato sotto il codice per recuperare JSON dal file FAQ-data.json presente nella directory del progetto.

Sto implementando in Xcode 7.3 usando Swift.

     func fetchJSONContent() {
            if let path = NSBundle.mainBundle().pathForResource("FAQ-data", ofType: "json") {

                if let jsonData = NSData(contentsOfFile: path) {
                    do {
                        if let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {

                            if let responseParameter : NSDictionary = jsonResult["responseParameter"] as? NSDictionary {

                                if let response : NSArray = responseParameter["FAQ"] as? NSArray {
                                    responseFAQ = response
                                    print("response FAQ : \(response)")
                                }
                            }
                        }
                    }
                    catch { print("Error while parsing: \(error)") }
                }
            }
        }

override func viewWillAppear(animated: Bool) {
        fetchFAQContent()
    }

Struttura del file JSON:

{
    "status": "00",
    "msg": "FAQ List ",
    "responseParameter": {
        "FAQ": [
            {                
                "question":Question No.1 here”,
                "answer":Answer goes here”,  
                "id": 1
            },
            {                
                "question":Question No.2 here”,
                "answer":Answer goes here”,
                "id": 2
            }
            . . .
        ]
    }
}

0

Potrei anche raccomandare Swift JSON Tutorial di Ray Wenderlich (che copre anche la fantastica alternativa a SwiftyJSON, Gloss ). Un estratto (che ha garantito, di per sé, non risponde completamente al poster, ma il valore aggiunto di questa risposta è il link, quindi nessun -1 per questo, per favore):

In Objective-C, l'analisi e la deserializzazione di JSON è abbastanza semplice:

NSArray *json = [NSJSONSerialization JSONObjectWithData:JSONData
options:kNilOptions error:nil];
NSString *age = json[0][@"person"][@"age"];
NSLog(@"Dani's age is %@", age);

In Swift, l'analisi e la deserializzazione di JSON sono un po 'più noiose a causa degli opzionali Swift e della sicurezza dei tipi [ma come parte di Swift 2.0, la guarddichiarazione è stata introdotta per aiutare a sbarazzarsi delle ifistruzioni nidificate :

var json: Array!
do {
  json = try NSJSONSerialization.JSONObjectWithData(JSONData, options: NSJSONReadingOptions()) as? Array
} catch {
  print(error)
}

guard let item = json[0] as? [String: AnyObject],
  let person = item["person"] as? [String: AnyObject],
  let age = person["age"] as? Int else {
    return;
}
print("Dani's age is \(age)")

Naturalmente, in XCode 8.x, basta toccare due volte la barra spaziatrice e dire "Ehi, Siri, per favore deserializza questo JSON per me in Swift 3.0 con spazio / rientri di tabulazione".


0

SWIFT VERSIONE SWIFTYJSON 3

func loadJson(fileName: String) -> JSON {

    var dataPath:JSON!

    if let path : String = Bundle.main.path(forResource: fileName, ofType: "json") {
        if let data = NSData(contentsOfFile: path) {
             dataPath = JSON(data: data as Data)
        }
    }
    return dataPath
}

0

Per prima cosa crea un codice Struc in questo modo:

  struct JuzgadosList : Codable {
    var CP : Int
    var TEL : String
    var LOCAL : String
    var ORGANO : String
    var DIR : String
}

Ora dichiara la variabile

 var jzdosList = [JuzgadosList]()

Leggi dalla directory principale

func getJsonFromDirectory() {

        if let path = Bundle.main.path(forResource: "juzgados", ofType: "json") {
            do {
                let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
                let jList = try JSONDecoder().decode([JuzgadosList].self, from: data)
                self.jzdosList = jList

                DispatchQueue.main.async() { () -> Void in
                    self.tableView.reloadData()
                }

            } catch let error {
                print("parse error: \(error.localizedDescription)")
            }
        } else {
            print("Invalid filename/path.")
        }
    }

Leggi dal web

func getJsonFromUrl(){

        self.jzdosList.removeAll(keepingCapacity: false)

        print("Internet Connection Available!")

        guard let url = URL(string: "yourURL")  else { return }

        let request = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 60.0)
        URLSession.shared.dataTask(with: request) { (data, response, err) in
            guard let data = data else { return }
            do {
                let jList = try JSONDecoder().decode([JuzgadosList].self, from: data)
                self.jzdosList = jList

                DispatchQueue.main.async() { () -> Void in
                    self.tableView.reloadData()
                }
            } catch let jsonErr {
                print("Error serializing json:", jsonErr)
            }
        }.resume()
    }

0

Usa questa funzione generica

func readJSONFromFile<T: Decodable>(fileName: String, type: T.Type) -> T? {
    if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            let jsonData = try decoder.decode(T.self, from: data)
            return jsonData
        } catch {
            print("error:\(error)")
        }
    }
    return nil
}

con questa riga di codice:

let model = readJSONFromFile(fileName: "Model", type: Model.self)

per questo tipo:

struct Model: Codable {
    let tall: Int
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.