Читання у файлі JSON за допомогою Swift


205

Мені дуже важко намагатися прочитати файл JSON у Swift, щоб я міг з ним пограти. Я витратив найкращу частину 2-х днів на пошук і пробування різних методів, але поки що не пощастило, тому я підписався на StackOverFlow, щоб побачити, чи хтось може вказати мені в правильному напрямку .....

Мій файл JSON називається test.json і містить таке:

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

Файл зберігається в документах безпосередньо, і я отримую доступ до нього за допомогою наступного коду:

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..... 

Якщо хтось може просто підштовхнути мене в правильному напрямку щодо того, як я можу де-серіалізувати файл JSON і помістити його у доступний об'єкт Swift, я буду вічно вдячний!

З повагою,

Криввенц.


1
використовуйте параметр помилки ...
Маттіас Бауч

2
Будь ласка, опублікуйте фактичний, складений код. Як і зараз, pathвін видно лише в ifобсязі та невирішений, коли ви його використовуєте NSData(contentsOfFile, options, error); у вас також є помилки друку в іменах перерахувань.
Крейрі

1
Мій API повністю оновлено для Swift 3: github.com/borchero/WebParsing
borchero

це ключ -> "значень": "% ЗАВАНТАЖЕННЯ ЗНАЧЕННЯ З файлу tmclass.json%", і мені потрібно розібрати ще один JSON з файлу, то як я можу досягти цього в SWIFT?
Mayur

Відповіді:


287

Дотримуйтесь наведеного нижче коду:

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

Масив "персони" буде містити всі дані для ключової особи. Повторіть його, щоб отримати його.

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
Було б корисніше, якщо ви пояснили, чому / як це вирішує проблему, описану в питанні, замість того, щоб просто представити купу коду.
Мартін R

Привіт Абхішек - Дякую за вашу відповідь, але вона все ще не працює. Це призводить до збоїв у програмі із наведеною нижче помилкою: 2014-06-25 16: 02: 04.146 H&S Capture [4937: 131932] *** Запуск програми через невдале виключення "NSInvalidArgumentException", причина: "*** - [_NSPlaceholderData initWithContentsOfFile: options: error:]: аргумент нульового файлу '*** Перший стек виклику кидка: Будь-які ідеї, чому це так? Для параметрів jsonData: Я поклав (шлях, параметри: NSDataReadingOptions.DataReadingMappedIfSafe, помилка: нуль)
Krivvenz

Неправильний шлях вашого файлу. Вочевидь, на вказаному вами шляху немає файлу з ім'ям test.json. Перевірте правильність розташування файлу
Abhishek

15
"нехай jsonData = NSData (contentOfFile: path!)" замість "let jsonData = NSData.dataWithContentsOfFile (шлях, параметри: .DataReadingMappedIfSafe, помилка: нуль)"
tong

7
Тут краще використати заяви іншої охорони, а не цю піраміду приреченості.
Зонілі Джейм

140

Якщо хтось шукає відповідь SwiftyJSON :
Оновлення:
Для 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
це перетворило мене на швидкого ДЖОСОНУ та карфагену! дякую :)
Пол Уанд

я використовував його лише для того, щоб виявити, що йому не вистачає відображення об’єктів, я наступного разу спробую іншу бібліотеку
Elazaron

Щоб уникнути помилки копіювання вставити в швидкій формі 3: NSData та NSError стали Data and Error.
selva

Я спробував кілька різних методів, і це працювало найкраще для мене в Swift 3
crobicha

(!) Так як MacOS 10.6 / IOS 4 є API url(forResourceв , (NS)Bundleщоб уникнути додаткового кроку , щоб створити URL
vadian

102

Швидкий перехід 4 за допомогою функції декодування

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
}

Швидкий 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
Це слід перемістити до нової функції документації або позначити як правильну відповідь.
система

24

Xcode 8 Swift 3 читає json з оновлення файлу:

    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

Оновлені назви для Swift 3.0

На підставі відповіді Абхішек в і відповідь 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

Спрощення прикладу, наданого Пітером Крейнцом. Працює зі Swift 4.2.

Функція розширення:

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

Приклад моделі:

struct Service: Decodable {
  let name: String
}

Приклад використання:

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

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

// use output if all good

Приклад також буде працювати з масивами:

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

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

// use output if all good

Зверніть увагу, як ми не надаємо зайвих дженериків, тому нам не потрібно подавати результат аналізу.


10

Відповідь Swift 2.1 (за мотивами Абхішека):

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

Вихід:

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

7

Це чудово працювало зі мною

func readjson(fileName: String) -> NSData{

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

    return jsonData!
}

7

Ось моє рішення за допомогою 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
}

Ready готове копіювальне вставлення, незалежне рішення сторонніх фреймворків.

використання 👇🏻

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


це працювало для мене. Мені потрібно було жорстко зашифрувати список додатків, які можна шукати. Я отримав файл json з бази даних mySQL. Я впустив файл json у проект XCODE, що працює вище у viewDidLoad та bam, у мене був словник json !!!
Брайан

5

Я даю ще одну відповідь, тому що жоден із наведених тут не орієнтований на завантаження ресурсу з тестового набору. Якщо ви користуєтесь віддаленою службою, яка видає JSON і хочете провести тестовий аналіз результатів, не потрапляючи на реальну службу, ви берете один або кілька відповідей і поміщаєте їх у файли в папці Тести у вашому проекті.

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

Тут також використовується SwiftyJSON, але основна логіка отримання тестового пакету та завантаження файлу - це відповідь на питання.


5

Swift 4: Спробуйте моє рішення:

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
}

Розширюваний + 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)
    }
}

Приклад:

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
Ваша fromJSONфункція розширення кидає, але в прикладі ви називаєте її без tryключового слова. Цей код не компілюється.
NeverwinterMoon

Крім того, fromJSONви використовуєте розширення Decodable, але ви не використовуєте будь-яку інформацію типу Decodable, але надаєте додаткові (абсолютно непотрібні) дженерики.
NeverwinterMoon

3

Останній швидкий 3.0 абсолютно працює

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

Перемістіть 4 JSONдо ClassсDecodable - для тих , хто вважає за краще заняття

Визначте класи так:

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
}

Використання, досить абстрактно:

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

Це дозволяє методи як для класів, так Peopleі Personзмінних (атрибутів) і методів також можна позначати так, як privateце потрібно.


3

Наступний код працює для мене. Я використовую Swift 5

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

Тоді, якщо ваша структура особи (або клас) є розширюваною (а також усі її властивості), ви можете просто зробити:

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

Я уникав усіх кодів помилок, щоб зробити код більш розбірливим.


2

Оновлено для Swift 3 найбезпечнішим способом

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

введіть тут опис зображення


2

Swift 5.1, Xcode 11

Ви можете скористатися цим:


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(Class.self, from: data)
   else {
        return nil
   }

   return person
}

1

Виходячи з відповіді Абхішека , для iOS 8 це було б:

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

Використовуєте Swift 2.0? Тоді так, це було б так. На це відповіли до 2.0.
Девід Поксон

1

Це працювало для мене з 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

Швидкий 4.1 Оновлений Xcode 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
Нічого нового немає, навпаки: не використовуйте NSDataв Swift 3+ і .allowFragmentsв цьому випадку безглуздо.
вадіан

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

Я використовував код нижче для отримання JSON з файлу FAQ-data.json, присутнього в каталозі проекту.

Я реалізую в Xcode 7.3 за допомогою 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()
    }

Структура файлу 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

Я також можу порекомендувати Swift JSON Підручника Рей Вендерліха (який також охоплює дивовижну альтернативу SwiftyJSON, Gloss ). Уривок (який наданий сам по собі не відповідає повністю плакату, але додана цінність цієї відповіді є посиланням, тому для цього немає ніяких -1):

У Objective-C аналіз і десеріалізація JSON досить простий:

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

У Swift розбір та десеріалізація JSON є трохи більш втомливим завдяки додаткам Swift та безпеці типу [але як частина] Swift 2.0, guardзаява була введена, щоб допомогти позбутися вкладених ifвисловлювань:

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)")

Звичайно, у XCode 8.x ви просто двічі торкніться пробілу та скажете "Ей, Сірі, будь ласка, скасуйте цей JSON для мене в Swift 3.0 за допомогою пробілу / вкладки-відступів".


0

SWIFTYJSON VERSION SWIFT 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

Спочатку створіть штрих Struc таким чином:

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

Тепер оголосимо змінну

 var jzdosList = [JuzgadosList]()

Читати з головного каталогу

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.")
        }
    }

Читати з Інтернету

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

Використовуйте цю загальну функцію

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
}

з цим рядком коду:

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

для цього типу:

struct Model: Codable {
    let tall: Int
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.